позвольте мне дать Пример: < /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!");
}
}
< /code>
То, что у нас есть здесь, очень простой код внутри форм Windows. У нас есть метод, который работает, когда мы нажимаем на кнопку. Этот метод запускает метод «Работа» внутри «task.run ()», а затем ожидает задачи «_completionTask». < /P>
В конце всего процесса мы должны увидеть отладь Консоль «Успешно встала ждет!». Интригующая вещь: [b] он никогда не достигнет его [/b]. Поток выполнения останавливается навсегда в wait _completiontask.task; [*] Если вы измените начало invoke , чтобы вызвать , это работает.
[*] Если вы уменьшите итерации на один с 10 001 до 10 000, это также работает! для ожидания, и мы также вставили его в начало в конце цикла, ожидание также будет успешно возвращено - без begininvoke , это тоже не будет работать.
< /ul>
И я предполагаю, что это из -за начала < /code> спама, создающего поток пользовательского интерфейса? Знайте реальную причину этого, и, может быть, некоторые объяснения того, как мы можем справиться с таким случаем, происходящим из призванного метода?
Подробнее здесь: https://stackoverflow.com/questions/793 ... y-begininv
Мобильная версия