C# 背景工作者
我已经做了一个方法,列出了路径中的所有ftp文件夹。 我的问题是,我需要将其作为数组返回。 但它是后台工作程序,我只能将其返回到RunWorkerCompleted, 结果是e。 1如何将参数传递给后台工作程序的方法 2如何将文件夹数组返回到正常方法? 像这样: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
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你能显示你的代码吗?我什么都不懂,但我现在正在尝试使用线程,也许它们会起作用。如果没有,我会发布我的代码。