等待AsyncMethod()与等待等待等待Task.Factory.StartNew (AsyncMethod)
给定以下方法:
public async Task DoSomethingAsync() { // do some work await OpenSomeFileAsync(); return new MyObject(); }
是否有区别:
public async void SomeEventHandler(EventArgs args) { var myObject = await await Task.Factory.StartNew<Task>( DoSomethingAsync); // do something with myObject }
和:
public async void SomeEventHandler(EventArgs args) { var myObject = await DoSomethingAsync(); // do something with myObject }
我认为DoSomethingAsync的“做一些工作”部分会在第一种情况下立即发生在新任务中,但说实话我并不完全理解Task,async和await是如何工作的,而且我很漂亮确定我只是为自己过度复杂的事情。
编辑:
这个问题来自于查看这个Metro示例: http : //code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782
特别是在MainPage.xaml.cs中,他们有:
var unused = Task.Factory.StartNew(async () => { // some work... }); // unused is of type Task
我试图在不使用匿名异步函数的情况下重做它,我开始想知道,为什么不写一个异步方法并等待它,而不是调用StartNew并交出一个异步函数?
大多数情况下,添加另一个Task
没有用,但在某些情况下,它可以。
不同之处在于,如果您在UI线程(或类似的东西DoSomethingAsync()
直接执行DoSomethingAsync()
,它的第一部分( // do some work
)也将在UI线程上执行,因此该方法的任何继续部分也将执行(除非他们使用ConfigureAwait()
)。 另一方面,如果你启动另一个Task
, DoSomethingAsync()
的第一部分和任何后续部分都将在ThreadPool
上执行。
如果DoSomethingAsync()
被正确编写,添加另一个Task
不应该给你任何优势(并且会给你带来更多开销的缺点),但我可以想象有些情况会有所不同。
此外,您可以编写:而不是使用Task.Factory.StartNew()
和两个await
s,
await Task.Run(DoSomethingAsync);
是的,有一点不同:在第一种forms中,你有一个额外的任务级别,这绝对没有任何用处。
第一种forms基本上等同于:
Task> task1 = Task.Factory.StartNew>( DoSomethingAsync); Task > task2 = await task1; var myObject = await task2;
所以它没有意义:你创建的任务只是……创造另一个任务。
上述就是C#学习教程:等待AsyncMethod()与等待等待等待Task.Factory.StartNew (AsyncMethod)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1026976.html