我有一個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