2011-12-22 108 views
2

我有一個C#線程的問題。C#線程同步

  1. 我有eendless進程「工人」,它做一些和迭代後睡3秒。

  2. 我有一個計時器功能,在給定的時間運行。

我需要的「計時器功能」做一些事情,然後等待結束「工人」的迭代,然後暫停「工人」,直至「計時器功能」完成自己的任務,該定時器功能啓動「工人後「再次。

我該怎麼做? 最好的問候保羅

+1

http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx – 2011-12-22 08:13:12

+1

http://msdn.microsoft.com/en-us/library/dd267312.aspx – dtb 2011-12-22 08:14:19

回答

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)控制在其他線程上運行的方法。

1

可以使用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); 
    } 
} 
+0

謝謝你的回答我會試試你的代碼,它是如何與我的工作人員合作的。 「工人」必須在一個單獨的線程? – Paul 2011-12-22 09:00:34

0

你需要工人和其他操作的工作相同常?如果沒有,你可以做類似的財產以後:

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(); 
} 
+0

「工作人員」每3秒鐘讀取一次文件,但當計時器到期時,在「工作人員」迭代之後暫停(不要中斷)「工作人員」(不會開始新的迭代)。然後定時器啓動另一個功能,它用相同的文件做一些操作。然後它完成它再次設置計時器並釋放工作人員,通過開始新的迭代繼續文件處理。 「工人」必須在一個單獨的線程? – Paul 2011-12-22 09:01:47

+0

爲什麼你不能在一個工作人員做閱讀和另一個操作? – gabba 2011-12-22 09:08:27

+0

你的另一項操作是什麼? – gabba 2011-12-22 09:11:32