2011-10-07 97 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