c# – 等待AsyncMethod()与等待await Task.Factory.StartNew(Asy
给出以下方法:
public async Task<MyObject> DoSomethingAsync() { // do some work await OpenSomeFileAsync(); return new MyObject(); } 是否有区别: public async void SomeEventHandler(EventArgs args) { var myObject = await await Task.Factory.StartNew<Task<MyObject>>( DoSomethingAsync); // do something with myObject } 和: public async void SomeEventHandler(EventArgs args) { var myObject = await DoSomethingAsync(); // do something with myObject } 在第一种情况下,我正在认为DoSomethingAsync的“做一些工作”的一部分会立即发生在一个新的任务中,但老实说,我完全不了解Tasks,async和等待工作的全部,我很漂亮肯定我只是为了我自己的事情过于复杂. 编辑: 这个问题来自于这个Metro例子: 具体在MainPage.xaml.cs中,他们有: var unused = Task.Factory.StartNew(async () => { // some work... }); // unused is of type Task<TResult> 我试图重做它,而不使用匿名异步功能,我开始怀疑,为什么不只是写一个异步方法,等待它,而不是调用StartNew和处理异步功能? 解决方法
大多数时候,添加另一个任务是没有用的,但在某些情况下,它可以是.
不同的是如果你在UI线程(或类似的东西)上直接执行DoSomethingAsync(),它的第一部分(//做一些工作)也将在UI线程上执行,所以方法的任何继续部分(除非他们使用ConfigureAwait()).另一方面,如果您启动另一个任务,DoSomethingAsync()的第一部分和任何以下部分将在ThreadPool上执行. 如果DoSomethingAsync()正确写入,添加另一个Task不应该给你任何优势(并且会给你更多的开销的缺点),但是我可以想象有些情况会有所改变. 另外,而不是使用Task.Factory.StartNew()和两个等待,你可以写: await Task.Run(DoSomethingAsync); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |