Await никогда не получает обратный вызов в потоке пользовательского интерфейса, когда его рассылает спам от BeginInvokesC#

Место общения программистов C#
Ответить
Anonymous
 Await никогда не получает обратный вызов в потоке пользовательского интерфейса, когда его рассылает спам от BeginInvokes

Сообщение Anonymous »

в последнее время я разрабатывал несколько библиотек, и я наткнулся на проблему, которая беспокоит меня, поскольку я не могу найти причину, почему это происходит. < /p>
позвольте мне дать Пример: < /p>

Код: Выделить всё

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// When we click a button, this happens.
private async void start_Click(object sender, EventArgs e)
{
await Task.Run(() => Work());

// When iterations are set to more than 10,000 in 'Work' method,
// this never runs.
Debug.WriteLine("Successfully Left Await!");
}

private void Work()
{
for (int i = 0; i < 10001; i++)
{
BeginInvoke(() =>
{
label1.Text = i.ToString();
});
}

// This always runs successfully.
Debug.WriteLine("Made Sure the Loop successfully finished!");
}
}
У нас есть очень простой код внутри Windows Forms. У нас есть метод, который запускается, когда мы нажимаем кнопку. Этот метод запускает метод «Работа» внутри «Task.Run()», а затем ожидает выполнения задачи «_completionTask».
В конце всего процесса мы должны увидеть отладку в консоль «Успешно осталось ждать!». Самое интересное: он никогда этого не достигнет. Поток выполнения навсегда останавливается в строке await _completionTask.Task;.
  • Если вы измените BeginInvoke на Invoke, это работает.
  • Если уменьшить количество итераций на одну с 10 001 до 10 000, это тоже работает!
  • Если использовать TaskCompletionSource для await И мы также поместили его в BeginInvoke в конце цикла, await также будет успешно возвращен - без BeginInvoke он тоже не будет работать.
И я предполагаю, что это из-за спама BeginInvoke, который слишком перегружает поток пользовательского интерфейса?
Мой вопрос это - кто-нибудь на самом деле знает настоящую причина этого и, возможно, какое-то объяснение того, как следует правильно обращаться с таким случаем?

Подробнее здесь: https://stackoverflow.com/questions/793 ... y-begininv
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»