【发布时间】:2021-03-04 14:16:34
【问题描述】:
我有以下从 VB6 应用程序调用的 工作 代码的 sn-ps。 唯一暴露的函数是 void Run() 函数。 该函数使用 backgroundWorker,我可以在 backgroundWorker_RunWorkerCompleted 中使用 e.Result 轻松查看该过程的结果。 因此,如果我从 VB6 调用 Run() ,那么一切都会完美,但我无法将 e.Result 的值返回给 VB6 调用者。 我也不能使用 string Run() 因为我在 Run() 中没有任何东西可以返回。
public void Run(string param)
{
backgroundWorker.RunWorkerAsync(argument: param);
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = "Done!";
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
string result = (string)e.Result;
}
如何将最终字符串 (e.result) 返回给调用 void Run()?我不能只使用 e.result,因为我正在从 VB6 应用程序调用“Run()”,并且我希望在那里得到返回的结果。
感谢您的帮助...
【问题讨论】:
-
呃,你不能。如果您想异步执行此操作,则调用代码需要支持它。制作两个函数
BeginRun和EndRun -
是否有可能让后台工作人员
public?然后,您的调用代码可以订阅工作人员的RunWorkerCompleted事件。 -
查看现代惯用方法的最后两个副本。 IE。使用在
TaskCompletionSource<T>对象中设置值的处理程序订阅RunWorkerCompleted事件,然后返回该对象的Task属性作为您操作的未来结果。 -
典型的例子是 WebBrowser,你在某处 Navigate() 并且浏览器在后台工作以加载页面。当它在几毫秒后完成时,它会引发其 DocumentCompleted 事件。做同样的事情,从 BackgroundWorker.RunWorkerCompleted 事件处理程序中引发一个事件。
标签: c# backgroundworker