Я запускаю базовое однопоточное приложение.Как этот блокирующий поток вызывает «освобождение»?
Как правило, при вызове System.Windows.Forms.MessageBox.Show()
можно было бы ожидать, что этот вызов эффективно блокирует дальнейшее выполнение до тех пор, пока этот метод не вернется.
Однако при использовании System.Windows.Forms.Timer
, кажется * же * нить какая-то образом освобождаясь и Timer
«s Tick
события стрельбы по этой же теме.
Что происходит дальше? У меня такое чувство, что это может иметь какое-то отношение к нарезке квартир, но я хотел бы получить некоторые разъяснения.
воссоздан в его простейшей форме в качестве консольного приложения следующим образом:
class Program
{
static void Main(string[] args)
{
new Program();
while (true)
{
System.Windows.Forms.Application.DoEvents();
}
}
private System.Windows.Forms.Timer timer;
public Program()
{
timer = new System.Windows.Forms.Timer() { Interval = 2000 };
timer.Tick += timer_Tick;
timer.Start();
}
private void timer_Tick(object sender, EventArgs e)
{
Console.WriteLine(string.Format("Thread {0} has entered", Thread.CurrentThread.ManagedThreadId));
var result = MessageBox.Show("Test");
Console.WriteLine(string.Format("Thread {0} has left", Thread.CurrentThread.ManagedThreadId));
}
}
Выход:
Thread 10 вступил
тему 10 вступил
тему 10 вступил
тему 10 введено
Резьба 10 введена
Это не хорошая тестовая программа, потому что вызов 'Application.DoEvents()' даст именно такое поведение. Можете ли вы воспроизвести его с помощью простого приложения Windows Forms? –
Я только называю это в моем коротком примере, так как это будет делать приложение winforms по умолчанию. – maxp
Приложение winforms по умолчанию НЕ будет вызывать 'Application.DoEvents()' –