Синхронные методы на основе асинхронных.
От: Sharov Россия  
Дата: 15.01.16 13:47
Оценка:
Здравствуйте.

Вот имеется на .net 4.0 метод типа ImportFileAsync:
Task<Tuple<bool, string>> ImportFileAsync(string file)
{
...
};


На сколько будет уместно и правильно делать синхронную версию сл. образом:
Tuple<bool, string> ImportFile(string file)
{
   var temp = ImportFileAsync(file);
   return temp.Result;
}


Думается, что это не самый правильный вариант с точки зрения поточной модели, т.к. разумно полагать, что никаких новых потоков создаваться не должно, а под капотом именно это и происходит. Ну даже если новый поток создан не будет (будет взят из пула), все равно ведь мы ожидаем что вызываемый метод будет работать в потоке вызывающего, что вообще говоря не так.

У меня дилемма: оставить как выше, или рефакторить асинхронный метод в нормальный синхронный вариант.
Кодом людям нужно помогать!
Re: Синхронные методы на основе асинхронных.
От: Sinix  
Дата: 15.01.16 14:35
Оценка: 14 (2)
Здравствуйте, Sharov, Вы писали:

S>У меня дилемма: оставить как выше, или рефакторить асинхронный метод в нормальный синхронный вариант.

Или оставить асинхронный, или держать рядом синхронную копию. Всяко проще, чем отхватить дедлок в продакшне.
Re[2]: Синхронные методы на основе асинхронных.
От: SHEMA  
Дата: 16.01.16 20:53
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Или оставить асинхронный, или держать рядом синхронную копию. Всяко проще, чем отхватить дедлок в продакшне.


А вот, например, новомодный HttpClient имеет только асинхронные версии методов. И синхронный вариант вызова будет через Result как у ТС:

using (var client = new HttpClient())
{
   ...
   var resp = client.PostAsync(serviceUrl, new ByteArrayContent(reqContent)).Result;
   var respContent = resp.Content.ReadAsByteArrayAsync().Result;
   ...
}
Re[3]: Синхронные методы на основе асинхронных.
От: Sinix  
Дата: 16.01.16 21:41
Оценка:
Здравствуйте, SHEMA, Вы писали:

SHE>А вот, например, новомодный HttpClient имеет только асинхронные версии методов. И синхронный вариант вызова будет через Result как у ТС:


Ну да, но тут есть нюанс: MS соблюдает guidelines и все await в коде фреймфорка используют .ConfigureAwait(false). Т.е. на них с оговорками можно положиться. В своём коде за этим кто будет следить?
Re[4]: Синхронные методы на основе асинхронных.
От: _Raz_  
Дата: 16.01.16 22:38
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S> В своём коде за этим кто будет следить?


ConfigureAwait Checker for ReSharper and Roslyn
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Re[5]: Синхронные методы на основе асинхронных.
От: Sinix  
Дата: 17.01.16 07:35
Оценка:
Здравствуйте, _Raz_, Вы писали:

S>> В своём коде за этим кто будет следить?


_R_>ConfigureAwait Checker for ReSharper and Roslyn

Не подсказывай

Есть ещё https://github.com/cincuranet/ConfigureAwaitChecker
но они оба не доведены до ума, тупо предлагают всунуть .ConfiguteAwait() в каждый await.
То есть для проектов с ui, где и делается большинство ошибок, не годятся от слова совсем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.