2011-10-07 106 views
0

我製作了一個列出路徑中所有ftp文件夾的方法。
我的問題是,我需要返回這個數組。
但是它是一個後臺工作者,我只能用e.Result將它返回到「RunWorkerCompleted」,

1)如何將參數傳遞給方法?(背景工作者)
2)如何將文件夾數組返回到常規方法?
像這樣:後臺工作人員

private void btnOpen_Click_1(object sender, EventArgs e) 
     { 
      string[]/List... a= getDirectories(**path**)? 
     } 

回答

0

你可以有一個列表的形式本身的一員,並有工人加入到如此,因爲它做它的工作(因爲工人代碼將屬於形式,會員將在範圍內)。

因此,如果您希望工作人員將其項目添加到列表的特定實例;只需在觸發工作人員之前將其設置到成員中即可。

但是,您必須謹慎使用此方法,以便在工作人員正在運行時不要訪問該列表;因爲它不是線程安全的。在.Net 4中,您可以使用線程安全的ConcurrentBag

如果您不想這樣做,那麼RunWorkerCompleted事件中傳遞的事件參數的Result成員就像您說的那樣用於交流結果 - 而且這就是您要返回列表的位置。您也可以使用ProgressChanged事件(on MSDN)來回傳結果的單個快照。

我不認爲這是不合理的:異步操作是一種完全不同的模式,以同步調用,你根本無法使用相同的調用和返回語義。

+0

是的,我想過。但我想每次都返回數組到特定的方法...而不是RunWorkerCompleted。 – funerr

0

您可以傳遞您的參數,因爲它們是對象。 BackgroundWorker採用參數object。一個變量object可以攜帶任何東西:數組,引用和變量。

實施例:

object[] args = new object[] { fileName, ....... }; 
this.backgroundWorker1.RunWorkerAsync(args); 
在該方法中

void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      object o = e.Argument; 
      object[] args = (object[])o; 
      string fileName = (string)args[0]; 
      .... 
      object[] result = .... 
      e.Result = result; 
     } 

當工作已完成:

void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 

      object o = e.Result; 
      object[] result = (object[])o; 
      ... 
     } 
+0

的問題是,我創建下載目錄中的所有文件的方法,我使用遞歸的話,我需要一個數組的形式返回到該方法,而不是到RunWorkerComplete。 – funerr

+0

@askingDude你能顯示你的代碼嗎?我不明白什麼 – 2011-10-07 14:46:24

+0

謝謝,但我想現在使用線程,也許他們會做的伎倆。如果沒有,我會發布我的代碼。 – funerr