我制作了一个列出路径中所有ftp文件夹的方法
我的问题是我需要将其作为数组返回
但它是一个后台工作者,我只能将它返回到“RunWorkerCompleted”,
与e.Result。
1)如何将参数传递给方法?(后台工作者)
2)如何将文件夹数组返回到普通方法?
像这样:
private void btnOpen_Click_1(object sender, EventArgs e)
{
string[]/List... a= getDirectories(**path**)?
}
答案 0 :(得分:0)
您可以将List作为表单本身的成员,并让工作人员在工作时添加(因为工作者代码属于表单,成员将在范围内)。
因此,如果您希望工作人员将其项目添加到列表的特定实例中;只需在触发工作人员之前将其设置为成员。
但是,您必须小心这种方法,以便在工作人员运行时不访问该列表;因为它不是线程安全的。在.Net 4中,您可以使用ConcurrentBag - 这是线程安全的。
如果您不想这样做,那么Result
事件中传递的事件参数的RunWorkerCompleted
成员,正如您所说,用于传达结果 - 这就是您所在的位置会返回你的清单。您还可以使用ProgressChanged
事件(on MSDN)来回传结果的各个快照。
我不认为这是不合理的:异步操作是同步调用的根本不同的范例,你根本不能使用相同的调用和返回语义。
答案 1 :(得分: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;
...
}