2011-12-22 141 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