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

本文关键字:然后 返回值 函数 另一个 线程 调用 | 更新日期: 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,
    };