我对C#线程有一个问题。
我需要"timer函数“做一些事情,然后等待"worker”迭代的结束,然后暂停"worker“,直到"timer函数”完成自己的任务,在那个定时器函数再次启动"worker“之后。
我怎么能这么做?向保罗问好
发布于 2011-12-22 14:23:25
您可以使用等待句柄来控制方法--类似于:
private AutoResetEvent mWorkerHandle = new AutoResetEvent(initialState: false);
private AutoResetEvent mTimerHandle = new AutoResetEvent(initialState: false);
// ... Inside method that initializes the threads
{
Thread workerThread = new Thread(new ThreadStart(Worker_DoWork));
Thread timerThread = new Thread(new ThreadStart(Timer_DoWork));
workerThread.Start();
timerThread.Start();
// Signal the timer to execute
mTimerHandle.Set();
}
// ... Example thread methods
private void Worker_DoWork()
{
while (true)
{
// Wait until we are signalled
mWorkerHandle.WaitOne();
// ... Perform execution ...
// Signal the timer
mTimerHandle.Set();
}
}
private void Timer_DoWork()
{
// Signal the worker to do something
mWorkerHandle.Set();
// Wait until we get signalled
mTimerHandle.WaitOne();
// ... Work has finished, do something ...
}这将让您了解如何通过WaitHandle (在本例中是AutoResetEvent)控制在其他线程上运行的方法。
发布于 2011-12-22 08:25:17
您可以在另一个线程正在执行某些操作时使用lock暂停线程:
readonly object gate = new object();
void Timer()
{
// do something
...
// wait for the end "worker" iteration and then
// pause "worker" until "timer function" is done
lock (gate)
{
// do something more
...
}
// start the "worker" again
}
void Worker()
{
while (true)
{
lock (gate)
{
// do something
...
}
Thread.Sleep(3000);
}
}发布于 2011-12-22 08:38:44
你需要工人的同级工作和其他手术吗?如果没有,你也可以做一些类似的事情:
EventWaitHandle processAnotherOperationOnNextIteration = new EventWaitHandle(false, EventResetMode.ManualReset);
Worker()
{
while(true)
{
doLongOperation();
if (processAnotherOperationOnNextIteration.WaitOne(0))
{
processAnotherOperationOnNextIteration.Reset();
doAnotherOperation();
}
Thread.Sleep(3000);
}
}内定时器
void Timer()
{
processAnotherOperationOnNextIteration.Set();
}https://stackoverflow.com/questions/8601024
复制相似问题