Configuration.ContinueOnCapturedContext - зачем?
От: artelk  
Дата: 27.06.21 12:33
Оценка:
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.
Отредактировано 27.06.2021 12:37 artelk . Предыдущая версия .
Re: Configuration.ContinueOnCapturedContext - зачем?
От: Danchik Украина  
Дата: 28.06.21 09:40
Оценка:
Здравствуйте, artelk, Вы писали:

[Skip]

Дабы не пересказывать
https://github.com/linq2db/linq2db/issues/1754
https://github.com/linq2db/linq2db/issues/1859
Re[2]: Configuration.ContinueOnCapturedContext - зачем?
От: artelk  
Дата: 01.07.21 15:06
Оценка:
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.