https://linq2db.github.io/articles/FAQ.html#which-async-model-linq-to-db-use
Почему не false везде, раз самой библиотеке этот контекст не нужен?
// Linq2Db library method
async Task<Foo> GetFooAsync()
{
//...
await SomethingElseAsync().ConfigureAwait(Configuration.ContinueOnCapturedContext);
//...
return ...;
}
// Client side code
async Task UIMethodAsync()
{
var foo = await GetFooAsync().ConfigureAwait(true); // или просто await GetFooAsync();
lbl1.Text = "Done";
}
В клиентском коде контекст восстановится, даже если Configuration.ContinueOnCapturedContext был false.
Здравствуйте, Danchik, Вы писали:
D>Дабы не пересказывать
D>https://github.com/linq2db/linq2db/issues/1754
D>https://github.com/linq2db/linq2db/issues/1859
Признаться понятней не стало.
Using ConfigureAwait(false) to avoid deadlocks is a dangerous practice. You would have to use ConfigureAwait(false) for every await in the transitive closure of all methods called by the blocking code, including all third- and second-party code. Using ConfigureAwait(false) to avoid deadlock is at best just a hack).
Логично. Проставление везде ConfigureAwait(false) в клиентском коде, в попытке избежать дедлоков, не есть хорошая идея, т.к. мы не можем гарантировать, что в библиотеках, которые мы вызываем, он везде проставлен.
Ок, но как из этого вытекает необходимость Configuration.ContinueOnCapturedContext в linq2db?
ConfigureAwait(false) делается не для того, чтобы небыло дэдлока на стороне клиентского кода, когда в нем кто-то делает синхронный Wait.
ConfigureAwait(false) делается, когда нет необходимости выполнять продолжение метода в том же контексте, что был перед await.
На сколько понимаю, в linq2db именно этот случай, посколько все работает так же, когда Configuration.ContinueOnCapturedContext==false.