Здравствуйте, alexzzzz, Вы писали:
A>Здравствуйте, Serginio1, Вы писали:
S>> И за, что минус?
A>ConfigureAwait ничего не даст. Без контекста синхронизации у потока нет простого способа вернуть управление в этот поток.
Так у него как есть контекст синхронизации. Для WinForms это WindowsFormsSynchronizationContext
Смотри внимательно исходное сообщение
А в WinForms-проекте вывод такой:
Даже если нет Контекта синхронизации, я могу его создать
if (SynchronizationContext.Current == null)
SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
Sc = SynchronizationContext.Current;
Здравствуйте, Serginio1, Вы писали:
S>По умолчанию в библиотеках нужно везде ставить .ConfigureAwait(false); S>true нужно только для модификации значений контролов
Не нужно давать таких советов. В многопоточности и асинхронности взаимодействие с GUI отнюдь не единственная и не самая сложная задача.
Здравствуйте, _Raz_, Вы писали:
_R_>Здравствуйте, Serginio1, Вы писали:
S>>По умолчанию в библиотеках нужно везде ставить .ConfigureAwait(false); S>>true нужно только для модификации значений контролов
_R_>Не нужно давать таких советов. В многопоточности и асинхронности взаимодействие с GUI отнюдь не единственная и не самая сложная задача.
Угу, только вокруг этого дедлоков постоянно идут вопросы везде связанного с контекстом синхронизации.
Как раз и беда в том, что создавая библиотеку, нужно учитывать, что она может быть вызвана из контекста синхронизации.
Просто создавая библиотеку нужно везде с await добавлять .ConfigureAwait(false). И даже там, где есть контекст синхронизации, если не нужно переключаться на поток GUI.
И в чем это вредный совет?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, _Raz_, Вы писали:
_R_>Здравствуйте, Serginio1, Вы писали:
S>> И в чем это вредный совет?
_R_>Люблю себя цитировать: "В многопоточности и асинхронности взаимодействие с GUI отнюдь не единственная и не самая сложная задача."
При этом данный вопрос относится к GUI.
Еще раз в чем вредный совет про .ConfigureAwait(false)?
Учитывая, что твоя библиотека может использоваться в GUI
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
_R_>>Люблю себя цитировать: "В многопоточности и асинхронности взаимодействие с GUI отнюдь не единственная и не самая сложная задача." S> При этом данный вопрос относится к GUI. S> Еще раз в чем вредный совет про .ConfigureAwait(false)?
Если есть код который может выполняться в отдельном планировщике то и запускать его там стоит явно. А вот распихивать по коду ConfigureAwait(false) в надежде так то, что оно по какой-то удаче продолжит выполняться где-то еще — решение так себе.
S> Учитывая, что твоя библиотека может использоваться в GUI
Ну это до первого Callback в GUI
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
S>> Еще раз в чем вредный совет про .ConfigureAwait(false)?
TK>Если есть код который может выполняться в отдельном планировщике то и запускать его там стоит явно. А вот распихивать по коду ConfigureAwait(false) в надежде так то, что оно по какой-то удаче продолжит выполняться где-то еще — решение так себе.
.ConfigureAwait(false) гарантирует, что будет игнорироваться Контекст синхронизации. Только и всего.
S>> Учитывая, что твоя библиотека может использоваться в GUI
TK>Ну это до первого Callback в GUI
И в чем проблема? .ConfigureAwait(false) гарантирует что будет игнорироваться Контекст синхронизации, и не будет переключаться на поток GUI.
Просто по умолчанию .ConfigureAwait(true), что приводит к дедлокам
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Sinix, Вы писали: S>Не согласен, т.к. всё советы в духе "просто используй X" без детального изучения матчасти принесут ещё больше вреда. Добавь в WPF app вот этот код: S>
S>>Просто по умолчанию .ConfigureAwait(true), что приводит к дедлокам
_R_>Да не это приводит к дедлокам, а попытка использовать асинхронные методы в синхронном режиме.
Да? Весь интернет ими усыпан. Именно для GUI по умолчанию асинхронные методы превращаются в синхронные там где это и не надо, по тому, что по умолчанию .ConfigureAwait(true).
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, TK, Вы писали:
S>>private async Task Button_Click(object sender, RoutedEventArgs e) S>> { S>> await RunAsync().ConfigureAwait(true); S>> button.Content = "x_X";
S>> MessageBox.Show("Completed:" + t.IsCompleted)); S>> }
TK>Правильно было вообще не трогать ConfigureAwait()
В данном случае да, так как ConfigureAwait(true); по умолчанию.
По мне так лучше по умолчанию использовать как раз ConfigureAwait(false); а в GUI как раз явно использовать ().ConfigureAwait(true);
там где нужно переключаться на поток GUI
и солнце б утром не вставало, когда бы не было меня