Удивленный никто не упомянул об этом:
public Task BlahAsync()
{
// ...
}
int result = BlahAsync().GetAwaiter().GetResult();
Не так хорошо, как некоторые из других методов здесь, но он имеет следующие преимущества:
AggregateException
(например Result
) Task
, так и для Task
( попробуйте сами! ) Кроме того, поскольку GetAwaiter
утиный, это должно работать для любого объекта, который возвращается из async (например, ConfiguredAwaitable
или YieldAwaitable
), а не только Задачи.
edit: Обратите внимание, что этот подход (или использование .Result
) возможен в тупик, если вы не убедитесь добавлять .ConfigureAwait(false)
каждый раз, когда вы ожидаете, для всех асинхронных методов, которые могут быть достигнуты с BlahAsync()
(а не только с теми, которые он вызывает напрямую). Объяснение .
// In BlahAsync() body
await FooAsync(); // BAD!
await FooAsync().ConfigureAwait(false); // Good... but make sure FooAsync() and
// all its descendants use ConfigureAwait(false)
// too. Then you can be sure that
// BlahAsync().GetAwaiter().GetResult()
// won't deadlock.
Если вы слишком ленивы, чтобы добавить .ConfigureAwait(false)
повсюду, и вы не заботитесь о производительности, вы также можете сделать
Task.Run(() => BlahAsync()).GetAwaiter().GetResult()
Использование:
ticks: {
fontColor: "#377216",
beginAtZero: true
}