2017-02-21 107 views
2

我有以下的代碼,並在.NET 4.5C#Task.Run相當於在.NET 4.0中

return Task.Run(async() => await MyAsyncMethodThatReturnsAnObject()).Result; 

工作正常,現在我需要它.NET 4.0運行,所以我想出了:

return Task.Factory.StartNew<object>(async() => { await MyAsyncMethodThatReturnsAnObject()}).Result; 

但它給我這個錯誤:

'Task<object>' does not contain a definition for GetAwaiter and no extension method 'GetAwaiter' acception the first argument of type 'Task<object>'

MyAsyncMethodThatReturnsAnObject是一種工廠方法,其返回類型爲object

+3

委託'異步()=>等待MyAsyncMethodThatReturnsAnObject()'等同於'工作()=> MyAsyncMethodThatReturnsAnObject()'兩個案例。 – spender

+0

更好的問題是你爲什麼這樣做?你釋放一個線程來阻止另一個? –

+0

@spender你的建議使我的代碼編譯,這是偉大的。但是,當我在調用方中做出相同的更改時,它失敗了:'不能轉換表達式類型'System.Threading.Tasks.Task '返回類型'System.Threading.Tasks.Task '' – AndreFeijo

回答

3

async/await是.NET 4.5。 您需要安裝Microsoft.Bcl.Async爲它在4

+2

請注意,如果您使用的是'Microsoft.Bcl.Async',則可以使用'TaskEx.Run('而不是'Task.Run(' –

-2
Task.Factory.StartNew<object>(() => 
    MyAsyncMethodThatReturnsAnObject().Result, 
    TaskScheduler.Default 
).Result 
+1

[StartNew is dangerous ](http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html),至少你應該傳入'TaskScheduler.Default'來防止導致你的任務代碼運行的錯誤如果你的代碼是re-entrent –

+1

@ScottChamberlain感謝您的評論,我編輯了我的答案,通過'TaskScheduler.Default'來匹配Task.Run的默認行爲 – lantian