Jus*_*ang 9 c# asynchronous task async-await
给出以下方法:
public async Task<MyObject> DoSomethingAsync() {
// do some work
await OpenSomeFileAsync();
return new MyObject();
}
Run Code Online (Sandbox Code Playgroud)
是否有区别:
public async void SomeEventHandler(EventArgs args) {
var myObject = await await Task.Factory.StartNew<Task<MyObject>>( DoSomethingAsync);
// do something with myObject
}
Run Code Online (Sandbox Code Playgroud)
和:
public async void SomeEventHandler(EventArgs args) {
var myObject = await DoSomethingAsync();
// do something with myObject
}
Run Code Online (Sandbox Code Playgroud)
我认为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<TResult>
Run Code Online (Sandbox Code Playgroud)
我试图在不使用匿名异步函数的情况下重做它,我开始想知道,为什么不写一个异步方法并等待它,而不是调用StartNew并交出一个异步函数?
svi*_*ick 11
大多数情况下,添加另一个Task是没用的,但在某些情况下,它可以.
不同之处在于,如果您在UI线程(或类似的东西)上DoSomethingAsync()直接执行,它的第一部分(// do some work)也将在UI线程上执行,因此该方法的任何延续部分也将执行(除非它们使用ConfigureAwait()).另一方面,如果你启动另一个Task,则第一部分和后续任何部分都DoSomethingAsync()将执行ThreadPool.
如果DoSomethingAsync()写得正确,添加另一个Task不应该给你任何好处(并且会给你带来更多开销的缺点),但我可以想象有些情况会有所不同.
另外,你可以写下:而不是使用Task.Factory.StartNew()和两个awaits.
await Task.Run(DoSomethingAsync);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11080 次 |
| 最近记录: |