我有这个简单的方法:
static int Work (string s) { return s.Length; }
我可以用以下命令运行它:
Task<string> task = Task.Factory.StartNew<int> (() => Work ("lalala") );
...
int result = task.Result;
或者用这个:
Func<string, int> method = Work;
IAsyncResult myIasync= method.BeginInvoke ("lalala", null, null);
...
int result = method.EndInvoke (myIasync);
- 它们都使用线程池线程。
- 两者都等待执行完成(读取值时)
- 两者都会向调用者重新抛出任何异常。
我应该什么时候使用每个?
第二种形式,使用IAsyncResult
,明显老了,而且威力也小得多。Task<T>
是在 .NET 4 中引入的,并且是现在表示异步操作的首选方式。使用起来要简单得多,特别是在支持“异步函数”的 C# 5 中,您可以以非阻塞方式等待任务(或其他异步操作)。
Using a Task
而不是打电话BeginInvoke
操作本身的执行方式可能不会有太大改变(尽管它在调度等方面为您提供了更多选择),但从想要“观察”操作的代码的角度来看,它产生了巨大的差异,请使用结果、等待多个任务、处理失败等。
如果您可以使用 C# 5(与 .NET 4.5 一起使用,或与 .NET 4 加上异步目标包一起使用),那么在管理异步操作时,它将使您的生活变得更加轻松。这是前进的方向:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)