C# 背景工作者

C# 背景工作者,c#,backgroundworker,parameter-passing,return-type,C#,Backgroundworker,Parameter Passing,Return Type,我已经做了一个方法,列出了路径中的所有ftp文件夹。 我的问题是,我需要将其作为数组返回。 但它是后台工作程序,我只能将其返回到RunWorkerCompleted, 结果是e。 1如何将参数传递给后台工作程序的方法 2如何将文件夹数组返回到正常方法? 像这样: private void btnOpen_Click_1(object sender, EventArgs e) { string[]/List... a= getDirectories(**pa

我已经做了一个方法,列出了路径中的所有ftp文件夹。 我的问题是,我需要将其作为数组返回。 但它是后台工作程序,我只能将其返回到RunWorkerCompleted, 结果是e。 1如何将参数传递给后台工作程序的方法 2如何将文件夹数组返回到正常方法? 像这样:

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

您可以将一个列表作为表单本身的成员,并让工作人员在执行其工作时将其添加到该列表中,因为工作人员代码将属于表单,所以该成员将在范围内

因此,如果您希望工作者将其项目添加到列表的特定实例中;只需在触发worker之前先将其设置到成员中

但是,您必须小心使用此方法,以免在工人运行时访问该列表;因为它不是线程安全的。在.NET4中,您可以使用-这是线程安全的

如果您不想这样做,那么在RunWorkerCompleted事件中传递的事件参数的Result成员,正如您所说的,用于传递结果——这就是您将返回列表的地方。您还可以使用ProgressChanged事件流式返回结果的单个快照


我不认为这是不合理的:异步操作与同步调用是根本不同的范例,您不能使用相同的调用和返回语义。

您可以传递参数,因为它们是对象。BackgroundWorker接受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;
            ...
        }

是的,我想过了。但我希望每次都将数组返回到特定的方法。。。不是到RunWorkerComplete。问题是我正在创建一个方法来下载目录中的所有文件,并且我正在使用递归,然后我需要返回一个数组到该方法,而不是到RunWorkerComplete。@askingDude你能显示你的代码吗?我什么都不懂,但我现在正在尝试使用线程,也许它们会起作用。如果没有,我会发布我的代码。