当你使用像这样的任务类时,我已经看到了:
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;
返回结果。但是,线程不在后台运行,我的整个程序等待它停止并将数据发回,所以我为什么要使用它呢?我可以简单地使用一个函数。
所以,为了让我得到一个结果,我需要运行另一个将运行此任务的任务? (或另一个线程,并不重要)。
有没有办法等不及仍然得到结果?
答案 0 :(得分:3)
任何不等待并仍能获得结果的方法?
不,因为在任务完成之前不是结果。
关键是你可以维护对任务的引用,执行一些其他操作,然后然后获得结果。
请注意,C#5使用async
和await
将异步操作链接起来变得容易得多 - 这样当操作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