Здравствуйте.
Вот имеется на .net 4.0 метод типа ImportFileAsync:
Task<Tuple<bool, string>> ImportFileAsync(string file)
{
...
};
На сколько будет уместно и правильно делать синхронную версию сл. образом:
Tuple<bool, string> ImportFile(string file)
{
var temp = ImportFileAsync(file);
return temp.Result;
}
Думается, что это не самый правильный вариант с точки зрения поточной модели, т.к. разумно полагать, что никаких новых потоков создаваться не должно, а под капотом именно это и происходит. Ну даже если новый поток создан не будет (будет взят из пула), все равно ведь мы ожидаем что вызываемый метод будет работать в потоке вызывающего, что вообще говоря не так.
У меня дилемма: оставить как выше, или рефакторить асинхронный метод в нормальный синхронный вариант.
Здравствуйте, Sharov, Вы писали:
S>У меня дилемма: оставить как выше, или рефакторить асинхронный метод в нормальный синхронный вариант.
Или оставить асинхронный, или держать рядом синхронную копию. Всяко проще, чем
отхватить дедлок в продакшне.
Здравствуйте, Sinix, Вы писали:
S>Или оставить асинхронный, или держать рядом синхронную копию. Всяко проще, чем отхватить дедлок в продакшне.
А вот, например, новомодный
HttpClient имеет только асинхронные версии методов. И синхронный вариант вызова будет через Result как у ТС:
using (var client = new HttpClient())
{
...
var resp = client.PostAsync(serviceUrl, new ByteArrayContent(reqContent)).Result;
var respContent = resp.Content.ReadAsByteArrayAsync().Result;
...
}
Здравствуйте, SHEMA, Вы писали:
SHE>А вот, например, новомодный HttpClient имеет только асинхронные версии методов. И синхронный вариант вызова будет через Result как у ТС:
Ну да, но тут есть нюанс: MS соблюдает guidelines и все await в коде фреймфорка используют .ConfigureAwait(false). Т.е. на них с оговорками можно положиться. В своём коде за этим кто будет следить?
Здравствуйте, Sinix, Вы писали:
S> В своём коде за этим кто будет следить?
ConfigureAwait Checker for ReSharper and Roslyn... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Здравствуйте, _Raz_, Вы писали:
S>> В своём коде за этим кто будет следить?
_R_>ConfigureAwait Checker for ReSharper and Roslyn
Не подсказывай
Есть ещё
https://github.com/cincuranet/ConfigureAwaitChecker
но они оба не доведены до ума, тупо предлагают всунуть .ConfiguteAwait() в каждый await.
То есть для проектов с ui, где и делается большинство ошибок, не годятся от слова совсем.