调用另一个线程函数然后返回值

时间:2014-12-16 00:41:44

标签: c# .net multithreading

我有两个线程我试图在我的主线程上调用一个函数,它工作正常。如下所示。

  this.Invoke(new Action(() => myFunction()));

但是当我尝试将值返回给变量时。我无法弄清楚如何获得此函数的返回值。

这不起作用,但却是我想要实现的目标。 值变量应该具有完美世界中函数的返回值。

   string value = this.Invoke(new Action(() => myFunction()));

有谁知道如何实现这个目标?

2 个答案:

答案 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,
    };