[英]Background workers
我已经制定了一种列出路径中所有ftp文件夹的方法。
我的问题是我需要将此作为数组返回。
但这是后台工作人员,我只能将其返回到“ RunWorkerCompleted”,
与e.Result。
1)如何将参数传递给方法?(背景工作者的)
2)如何将文件夹数组恢复为常规方法?
像这样:
private void btnOpen_Click_1(object sender, EventArgs e)
{
string[]/List... a= getDirectories(**path**)?
}
您可以将List作为表单本身的成员,并在它的工作过程中添加worker(由于worker代码将属于表单,因此该成员将在范围内)。
因此,如果您希望工作人员将其项目添加到列表的特定实例中,请执行以下操作: 只需在触发工作程序之前先将其设置为成员。
但是,您必须谨慎使用此方法,以免在工作程序运行时访问该列表。 因为它不是线程安全的。 在.Net 4中,您可以使用ConcurrentBag-这是线程安全的。
如果您不想这样做,那么可以按照您所说的,在RunWorkerCompleted
事件中传递的事件参数的Result
成员用于传递结果-这就是您返回列表的地方。 您还可以使用ProgressChanged
事件( 在MSDN上 )也可以流回结果的单个快照。
我不认为这是不合理的:异步操作是与同步调用根本不同的范例,您根本不能使用相同的调用返回语义。
您可以传递参数,因为它们是对象。 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;
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.