任务 vs c#中的异步委托?
我有这个简单的方法:
static int Work (string s) { return s.Length; }
我可以运行它:
Task task = Task.Factory.StartNew (() => Work ("lalala") ); ... int result = task.Result;
或者用这个:
Func method = Work; IAsyncResult myIasync= method.BeginInvoke ("lalala", null, null); ... int result = method.EndInvoke (myIasync);
- 它们都使用线程池线程。
- 两者都等待执行完成(读取值时)
- 两者都重新抛出调用者的任何exception。
我应该何时使用?
第二种forms,使用IAsyncResult
,显着更老,function更强大。 Task
是在.NET 4中引入的,是现在表示异步操作的首选方式。 它使用起来要简单得多,特别是在支持“异步函数”的C#5中,您可以以非阻塞方式等待任务(或其他异步操作)。
使用Task
而不是调用BeginInvoke
可能不会改变操作本身的执行方式(尽管它在调度等方面为您提供了更多选项),但是从想要“代码”的角度来看,它有很大的不同。观察“操作,使用结果,等待多个任务,处理故障等
如果您可以使用C#5(使用.NET 4.5,或使用.NET 4加上异步目标包),那么在管理异步操作时,它将使您的工作变得更加轻松。 这是前进的方式:)
任务更优雅,并且最近被引入(.Net 4)所以如果它满足您的需求,我会选择它。