背景工人

时间:2011-10-07 10:33:47

标签: c# backgroundworker parameter-passing return-type

我制作了一个列出路径中所有ftp文件夹的方法 我的问题是我需要将其作为数组返回 但它是一个后台工作者,我只能将它返回到“RunWorkerCompleted”,
与e.Result。
1)如何将参数传递给方法?(后台工作者)
2)如何将文件夹数组返回到普通方法? 像这样:

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

2 个答案:

答案 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;
            ...
        }