我有一个C#线程的问题。C#线程同步
我有eendless进程“工人”,它做一些和迭代后睡3秒。
我有一个计时器功能,在给定的时间运行。
我需要的“计时器功能”做一些事情,然后等待结束“工人”的迭代,然后暂停“工人”,直至“计时器功能”完成自己的任务,该定时器功能启动“工人后“再次。
我该怎么做? 最好的问候保罗
我有一个C#线程的问题。C#线程同步
我有eendless进程“工人”,它做一些和迭代后睡3秒。
我有一个计时器功能,在给定的时间运行。
我需要的“计时器功能”做一些事情,然后等待结束“工人”的迭代,然后暂停“工人”,直至“计时器功能”完成自己的任务,该定时器功能启动“工人后“再次。
我该怎么做? 最好的问候保罗
你可以使用等待句柄来控制方法 - 是这样的:
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)控制在其他线程上运行的方法。
可以使用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);
}
}
谢谢你的回答我会试试你的代码,它是如何与我的工作人员合作的。 “工人”必须在一个单独的线程? – Paul 2011-12-22 09:00:34
你需要工人和其他操作的工作相同常?如果没有,你可以做类似的财产以后:
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();
}
http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx – 2011-12-22 08:13:12
http://msdn.microsoft.com/en-us/library/dd267312.aspx – dtb 2011-12-22 08:14:19