Информация об изменениях

Сообщение Re[4]: [.NET][async][WinForms] от 22.12.2016 7:33

Изменено 22.12.2016 9:01 Serginio1

Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>> И за, что минус?

S>В смысле минус? Это ж просто "не согласен" кнопка. Обозначение неудачное, но все привыкли.

S>Не согласен, т.к. всё советы в духе "просто используй X" без детального изучения матчасти принесут ещё больше вреда. Добавь в WPF app вот этот код:

S>
S>        private void Button_Click(object sender, RoutedEventArgs e)
S>        {
S>            RunAsync(() => button.Content = "x_X")
S>                .ContinueWith(t => MessageBox.Show("Completed:" + t.IsCompleted));
S>        }

S>        private async Task RunAsync(Action onNext)
S>        {
S>            await Task.Delay(1).ConfigureAwait(false);
S>            onNext();
S>        }
S>


S>и попробуй найти все места, где что-то пошло не так. Там их как минимум шесть. Список —

S>
  спойлер
S>по ссылке


Ны дык значения контролов нужно устанавливать в потоке GUI
Поэтому правильно делать так.

private async Task Button_Click(object sender, RoutedEventArgs e)
        {
            await RunAsync().ConfigureAwait(true);
                        button.Content = "x_X";

            MessageBox.Show("Completed:" + t.IsCompleted));
        }

А вот если в моем варианте RunAsync сделать
await Task.Delay(1);

без .
ConfigureAwait(false);

то получим дедлок
Re[4]: [.NET][async][WinForms]
Здравствуйте, Sinix, Вы писали:

S>Не согласен, т.к. всё советы в духе "просто используй X" без детального изучения матчасти принесут ещё больше вреда. Добавь в WPF app вот этот код:

S>
S>        private void Button_Click(object sender, RoutedEventArgs e)
S>        {
S>            RunAsync(() => button.Content = "x_X")
S>                .ContinueWith(t => MessageBox.Show("Completed:" + t.IsCompleted));
S>        }

S>        private async Task RunAsync(Action onNext)
S>        {
S>            await Task.Delay(1).ConfigureAwait(false);
S>            onNext();
S>        }
S>


S>и попробуй найти все места, где что-то пошло не так. Там их как минимум шесть. Список —

S>
  спойлер
S>по ссылке


Ны дык значения контролов нужно устанавливать в потоке GUI
Поэтому правильно делать так.

private async Task Button_Click(object sender, RoutedEventArgs e)
        {
            await RunAsync().ConfigureAwait(true);
                        button.Content = "x_X";

            MessageBox.Show("Completed:" + t.IsCompleted));
        }

А вот если в моем варианте RunAsync сделать
await Task.Delay(1);

без .
ConfigureAwait(false);

то получим дедлок