为什么我要在c#中使用任务结果?
本文关键字:任务 结果 我要 为什么 | 更新日期: 2023-09-27 17:54:37
当你像这样使用任务类时,我看到过:
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;
从Task
获得结果。然而,线程没有在后台运行,我的整个程序等待它停止并发送数据回来,所以我为什么要使用这个呢?我可以简单地用一个函数。
所以,为了得到一个结果,我需要运行另一个任务来运行这个任务?(或其他线程,不重要)。
有没有办法不等待,仍然得到结果?
有什么办法不等待,仍然得到结果?
不,因为在任务完成之前没有结果。
关键是您可以维护对任务的引用,执行一些其他操作,然后然后获得结果。
请注意,c# 5使得使用async
和await
将异步操作链在一起变得容易得多-这样当操作X需要等待操作Y完成时,它可以等待它,并且操作X的调用者获得一个表示正在进行的操作的任务…当Y完成时,X将继续,当它完成时,任务返回给调用者也将完成。
有什么办法不等待,仍然得到结果?
是的,您将使用延续。这也可以被安排在当前的同步上下文中运行(所以如果你在一个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