Ах, ха! есть управляемый событиями способ сделать это. Я позаимствовал Dispatcher
у WPF. Я просто предоставляю вращающемуся потоку доступ к главному потоку CurrentDispatcher
. Я позволяю потоку вращаться, и когда ему требуется внимание, он вызывает делегата на Dispatcher
и спит, ожидая, пока основной поток прервет его. Я знаю, что мог бы использовать Invoke
вместо BeginInvoke
, но мне нужно было использовать прерывание, потому что метод, который перезапускает рабочий поток, не является синхронной частью стека отправленных делегатов.
Хорошо это или плохо, вот мой код:
private void Run()
{
while (true)
{
...
// Need attention from the main thread
// "_main" is the main thread's Dispatcher instance.
_main.BeginInvoke(new MyEventHandler(OnNeedsAttention), this, new MyEventArgs(...));
try
{
Thread.Sleep(Timeout.Infinite);
}
catch (ThreadInterruptedException) { }
}
}