2017-02-21 26 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 is .NET 4.5. Вам необходимо установить Microsoft.Bcl.Async для того, чтобы работать в 4

+2

Обратите внимание, что если вы используете 'Microsoft.Bcl.Async', вы можете вернуть функцию Run обратно с помощью' TaskEx.Run ('вместо' Task.Run (' –

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

[StartNew является опасным ] (http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html), как минимум вы должны проходить в 'TaskScheduler.Default', чтобы предотвратить ошибки, вызывающие запуск вашего кода задачи на поток пользовательского интерфейса, если ваш код повторно запущен. –

+1

@ScottChamberlain Спасибо за комментарий, я отредактировал свой ответ, чтобы передать 'TaskScheduler.Default', чтобы соответствовать поведению' Task.Run' по умолчанию – lantian

 Смежные вопросы

  • Нет связанных вопросов^_^