2016-07-29 117 views
0
// This does not work 
Task t = await Task.Run(async() => { await requestThread.Execute(); }, cts.Token); 

// This does work 
Task t = Task.Run(async() => { await requestThread.Execute(); }, cts.Token); 

当我尝试以上(含的await)我得到错误“无法隐式转换类型‘无效’到‘System.Threading.Tasks.Task’如何获得任务的处理时,它正在等待

获取Task.Run返回的任务句柄的正确方法是什么?

Execute方法的定义是这样的:

public async Task Execute() 

回答

3

你不必等待一个对象被创建在同一行,这是完全没有做

Task t = Task.Run(async() => { await requestThread.Execute(); }, cts.Token); 
await t; 

现在你请参考t,并等待完成。


顺便说一句,我觉得很奇怪,你是在一个Task.Run包装一个异步任务,并异步方法在一开始有一个大的同步部分在内部等待过吗?如果它不,你应该可能只是做

Task t = requestThread.Execute(); 
await t; 
+0

我完全在想它...这工作,它是如此的干净。谢谢! –

+0

嘿斯科特,在我的Execute方法中,我向一个REST Web服务做了一个HttpRequest。你会说这是将Execute方法包装在“Task.Run”中的一个好动机吗?你可以在这里找到更多的代码:http://codereview.stackexchange.com/questions/136243/task-run-proper-use –

+0

我也会发送'SendRequest'异步并等待该方法。那么就没有必要去做'Task.Run' –