我有两个线程我试图在我的主线程上调用一个函数,它工作正常。如下所示。
this.Invoke(new Action(() => myFunction()));
但是当我尝试将值返回给变量时。我无法弄清楚如何获得此函数的返回值。
这不起作用,但却是我想要实现的目标。 值变量应该具有完美世界中函数的返回值。
string value = this.Invoke(new Action(() => myFunction()));
有谁知道如何实现这个目标?
答案 0 :(得分:2)
不完全是你想要的,但是将myFunction
的结果捕获到delgate中的局部变量中将完成工作:
string value;
this.Invoke(new Action(() => { value= myFunction();} ));
或者正如TyCobb指出的那样,以下内容应该起作用Control.Invoke返回函数的结果:
string value = (string)this.Invoke(myFunction);
答案 1 :(得分:0)
执行所需操作的最基本方法是使用任务。在async
函数中,您可以使用以下任务等待值:
string value = await Task.Run(myFunction);
或者,如果您愿意,可以这样:
string value = await Task.Run(() => myFunction());
我更喜欢使用微软的反应式框架(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,
};