Это вопрос из двух частей .
Первый , допустим, у меня есть функция, выполняющаяся в другом потоке:
private AutoResetEvent StopEvent = new AutoResetEvent( false);
public void WorkerThread()
{
while( !StopEvent.WaitOne( 10)) {
a();
b();
c();
}
}
Теперь я хочу приостановить эту тему.Thread.Suspend
не может быть и речи, потому что она не может гарантировать мне безблокировочную систему после вызова.Ожидание другого AutoResetEvent также нежелательно, поскольку пауза «гранулярность» будет слишком большой.Я придумала два «решения», но не в восторге ни от одного из них (но на данный момент предпочтительнее № 2):
1) чередование PauseEvent.WaitOne()
везде:
private AutoResetEvent StopEvent = new AutoResetEvent( false);
private ManualResetEvent PauseEvent = new ManualResetEvent( true);
public void WorkerThread()
{
while( !StopEvent.WaitOne( 10)) {
PauseEvent.WaitOne( 0);
a();
PauseEvent.WaitOne( 0);
b();
PauseEvent.WaitOne( 0);
c();
}
}
2) заставить a (), b () и c () бросить a MyException
.Затем я могу подождать в блоке перехвата, пока не появится сигнал нажатия кнопки «возобновить». PauseEvent:
private AutoResetEvent StopEvent = new AutoResetEvent( false);
private AutoResetEvent PauseEvent = new AutoResetEvent( false);
public void WorkerThread()
{
while( !StopEvent.WaitOne( 10)) {
try {
a();
b();
c();
} catch( MyException) {
PauseEvent.WaitOne(); // wait indefinitely until signaled by another thread
}
}
}
(2) действительно кажется единственным способом сделать это, но я хотел бы знать, есть ли у кого-нибудьпопробовал другой метод "паузы".
Во-вторых , часть, на которую я натолкнулся, является хорошим способом для решения №2 вызвать в первую очередь исключение.В настоящее время я в основном инструментировал низкоуровневый код, вызываемый a (), b () и c (), для поиска события, которое должно быть сигнализировано, которое говорит им выбросить MyException.Это единственный способ, которым я знаю, что вы можете вызывать поведение в одном потоке из другого.
Что бы я действительно хотел бы знать - это (и я уверен, что это невозможно), есть ли какой-то сумасшедший способ в .NET заставить рабочий поток регистрировать обработчик событий, чтобы при запуске события из моего графического интерфейса этот рабочий поток немедленно останавливал свою работу и выполнял обработчик?Я думаю, что я в основном ищу что-то вроде подпрограммы обработки прерываний, как то, что вы обычно реализуете на микроконтроллере.