调用另一个线程函数,然后返回值
本文关键字:然后 返回值 函数 另一个 线程 调用 | 更新日期: 2023-09-27 18:34:26
我有两个线程 im 试图在我的主线程上调用一个工作正常的函数。如下所示。
this.Invoke(new Action(() => myFunction()));
但是当我尝试将值返回给变量时。我不知道如何获取此函数的返回值。
这行不通,但正是我想要实现的目标。值变量应该具有理想世界中我的函数的返回值。
string value = this.Invoke(new Action(() => myFunction()));
有谁知道如何实现这一目标?
不完全是你想要的,但是捕获myFunction
到delgate内部局部变量的结果将完成工作:
string value;
this.Invoke(new Action(() => { value= myFunction();} ));
或者正如 TyCobb 指出的那样,下面应该作为 Control.Invoke 返回函数的结果:
string value = (string)this.Invoke(myFunction);
做你想做的事的最基本方法是使用任务。在 async
函数中,您可以使用如下任务等待值:
string value = await Task.Run(myFunction);
或者,如果你愿意,像这样:
string value = await Task.Run(() => myFunction());
我更喜欢使用Microsoft的反应式框架(Nuget "Rx-Main"),如下所示:
Observable.Start(myFunction).Subscribe(value =>
{
/* do something with `value` */
});
响应式框架有更多的运算符,TPL你可以更简洁地使用它。
只是为了给你一个小的味道,下面是一个示例查询,用于异步下载一系列包含特定字符串的网页:
var query =
from url in urls.ToObservable()
from content in Observable.Using(
() => new WebClient(),
wc => Observable.Start(() => wc.DownloadString(url)))
where content.Contains("<div class='"foo'" />")
select new
{
url,
content,
};