2017-02-21 6 views
2

Ich habe den folgenden Code und es funktioniert gut in .NET 4,5C# Task.Run Äquivalent in .NET 4.0

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

Jetzt muss ich es auf .NET 4.0, so dass ich laufen kam mit:

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

Aber es ist mir diesen Fehler geben:

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

MyAsyncMethodThatReturnsAnObject ist eine Factory-Methode und der Rückgabetyp lautet object.

+3

Der Delegierte 'async() => erwarten MyAsyncMethodThatReturnsAnObject() zu arbeiten' entspricht '() => MyAsyncMethodThatReturnsAnObject()' in beide Fälle. – spender

+0

Bessere Frage ist, warum machst du das? hast du einen Thread freigegeben, um einen anderen zu blockieren? –

+0

@spender Ihr Vorschlag hat meinen Code kompiliert, was großartig ist. Jedoch, als ich die gleiche Änderung in der Aufrufer es fehlgeschlagen: "Kann nicht Ausdruck Typ konvertieren 'System.Threading.Tasks.Task ' zurück zum Typ 'System.Threading.Tasks.Task '" – AndreFeijo

Antwort

3

async/erwarten ist .NET 4.5. Sie müssen Microsoft.Bcl.Async installieren es in 4.

+2

Beachten Sie, dass Sie, wenn Sie 'Microsoft.Bcl.Async' verwenden, die Funktion Run zurück mit' TaskEx.Run ('anstelle von' Task.Run (' –

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

[StartNeu ist gefährlich ] (http://blog.stephencleary.com/2013/08/startnew-dangerous.html), mindestens sollten Sie "TaskScheduler.Default" eingeben, um Fehler zu verhindern, die dazu führen, dass Ihr Taskcode ausgeführt wird auf dem UI-Thread, wenn der Code wieder einläuft –

+1

@ScottChamberlain Danke für den Kommentar, ich habe meine Antwort bearbeitet, um den 'TaskScheduler.Default' zu übergeben, um dem Standardverhalten von' Task.Run' zu entsprechen – lantian