我为什么要在任务C#中使用Result?

时间:2015-06-09 19:47:54

标签: c# .net multithreading asynchronous

当你使用像这样的任务类时,我已经看到了:

calc()

您可以使用 Task<Test> task2 = Task<Test>.Factory.StartNew(() => { string s = ".NET"; double d = 4.0; for (int i = 0; i < 3; i++) { } return new Test { Name = s, Number = d }; }); Test tt = task2.Result;返回结果。但是,线程不在后台运行,我的整个程序等待它停止并将数据发回,所以我为什么要使用它呢?我可以简单地使用一个函数。

所以,为了让我得到一个结果,我需要运行另一个将运行此任务的任务? (或另一个线程,并不重要)。

有没有办法等不及仍然得到结果?

2 个答案:

答案 0 :(得分:3)

  

任何不等待并仍能获得结果的方法?

不,因为在任务完成之前不是结果。

关键是你可以维护对任务的引用,执行一些其他操作,然后然后获得结果。

请注意,C#5使用asyncawait将异步操作链接起来变得容易得多 - 这样当操作X需要等待操作Y完成时,它可以等待它,并且操作X的调用者得到一个表示正在进行的操作的任务...当Y完成时,X将恢复,当完成时,返回给调用者的任务也将完成。

答案 1 :(得分:2)

  

任何不等待并仍能获得结果的方法?

是的,你会使用延续。这可以安排在当前同步上下文上运行(所以,如果你在UI应用程序中,也就是UI线程)。

这看起来像是:

Task<Test> task2 = Task.Factory.StartNew(() =>
{
    string s = ".NET";
    double d = 4.0;
    for (int i = 0; i < 3; i++) { }
    return new Test { Name = s, Number = d };
});

task2.ContinueWith(t =>
{
    // This runs when things are done
    Test tt = t.Result;
    // use tt
}, TaskScheduler.FromCurrentSynchronizationContext());

如果您使用的是C#5和.NET 4.5,这将变得更加简单:

Test tt = await Task.Run(() =>
{
    string s = ".NET";
    double d = 4.0;
    for (int i = 0; i < 3; i++) { }
    return new Test { Name = s, Number = d };
});

// use tt