Имам теоритично разбиране защо не трябва да се смесват синхронни и асинхронни методи. Искам само да ми обясните следното:
Имам метод Dispose(), който трябва да извиква асинхронен метод. Тъй като 95% от кода ми е асинхронен, рефакторирането не ми е вариант. Ако имаше интерфейс IAsyncDisposable, който се поддържа от фреймуърка щеше да е прекрасно,ама няма. Трябва ми надежден начин да извиквам асинхронни методи от синхронен такъв без да се получава deadlock.
Предпочитам да не използвам ConfigureAwait(false), защото създава необходимост из целия код извикващия метод да се държи по точно определен начин, в случай че е синхронен.Предпочитам да променя нещо в синхронния метод.
Четох насам-натам и попаднах на един коментар относно това че, Task.Run() винаги слага дори асинхронните методи в threadpool-а.Това ме накара да се замисля.
В .NET 4.5 всеки synchronization context задава task-овете на текущата нишка. Ако имам следния асинхронен метод:
private async Task MyAsyncMethod()
{
...
}
Ако искам да го извикам от синхронен метод може ли просто да използвам Task.Run() с Wait() за да избегна deadlock, тъй като слага асинхронния метод в опашката на threadpool-а?
private void MySynchronousMethodLikeDisposeForExample()
{
Task.Run((Func<Task>)MyAsyncMethod).Wait();
}