Csharp/C#教程:等待AsyncMethod()与等待等待等待Task.Factory.StartNew (AsyncMethod)分享


等待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() )。 另一方面,如果你启动另一个TaskDoSomethingAsync()的第一部分和任何后续部分都将在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

(0)
上一篇 2022年1月10日
下一篇 2022年1月10日

精彩推荐