Async/Await все еще относительно новы, но есть некоторые хорошие практики, помогающие прояснить API. Основы являются это:
- метод объявляя себя как
async
означает, что он ожидает await
позже
async
неявно создает Task
для вас.
await
походит на закладку. Приложение возобновляется, когда использовалось ключевое слово ожидания.
- Вы не можете
await
ничего, что не IAwaitable
(чаще всего являются Task
) (citation)
В приложении, где есть оба асинхронные вызовы и синхронные вызовы, мы приняли соглашение об именах:
async
вызывает возврат Task
или Task<T>
и добавляет слово Async
в конец имени.
- Синхронные вызовы (по умолчанию) просто работают, как и любой метод, и нет специального соглашения.
Часто бывает два метода, которые выполняют одно и то же, но одно синхронно, а другое нет. Вы можете либо реализовать его двумя разными способами, либо перенести один на другой. Это действительно зависит от ваших потребностей и того, что даст вам более гибкое приложение.
В приведенном выше примере правильный способ обработки асинхронных и обычных вызовов метода будет для MyLibrary
, чтобы разоблачить два метода. Пример будет выглядеть так:
public static class MyLibrary
{
public static void DoSomething()
{
// do some work
}
public static async Task DoSomethingAsync()
{
// do similar work but use async API,
// can also simply call DoSomething().
}
}
// In another part of code would be called like this:
public static async Task BiggerMethod()
{
MyLibrary.DoSomething();
await MyLibrary.DoSomethingAsync();
}
То, что вы хотите, чтобы избежать оборачивает в async
метод с обычным методом. Как только вы сразу работаете с Task
, вы теряете все преимущества async
и await
, и вы вводите места, где ваш код может блокировать.
Try, чтобы избежать использования 'асинхронной main' - см http://stackoverflow.com/questions/9208921/async- on-main-method-of-console-app для получения дополнительной информации. – rhughes
Этот ответ может быть вам полезен: http://stackoverflow.com/questions/22808475/how-to-force-execution-to-stop-till-asynchronous-function-is-fully-executed – user3340627
См. [Любая разница между «Ожидание Task.Run(); return "и" return Task.Run() "?] (http://stackoverflow.com/q/21033150/1768303). – Noseratio