C#线程同步
我对C#线程有问题C#线程同步,c#,multithreading,C#,Multithreading,我对C#线程有问题 我有一个无提示的进程“worker”,它做了一些工作,并在迭代后休眠3秒 我有一个在给定时间运行的计时器函数 我需要“timer函数”做一些事情,然后等待结束“worker”迭代,然后暂停“worker”,直到“timer函数”完成自己的任务,然后计时器函数再次启动“worker” 我该怎么做? 向Paul致意当另一个线程正在执行某项操作时,您可以使用锁来暂停线程: readonly object gate = new object(); void Timer() {
向Paul致意当另一个线程正在执行某项操作时,您可以使用
锁来暂停线程:
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);
}
}
您是否需要工人的并行工作和其他操作?如果没有,您可以做一些类似的事情:
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();
}
您可以使用等待句柄来控制这些方法,例如:
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 ...
}
这将使您了解如何通过(在本例中为an)控制其他线程上运行的方法。感谢您的回答,我将尝试您的代码,了解它如何与我的工作人员一起工作。“worker”必须位于单独的线程中,“worker”每隔3秒读取一次文件,但当计时器过期时,它会在“worker”迭代之后暂停(不要中断)“worker”(不启动新的迭代)。然后定时器启动另一个函数,它对同一个文件执行一些操作。完成后,它再次设置计时器并释放worker,worker通过启动新的迭代来继续文件处理。“worker”必须在一个单独的线程中?您的另一个操作是什么?因为“worker”将忙碌大约5分钟,我希望在“worker”空闲后,相同的文件进程也会出现。实际上,另一个函数执行与“worker”相同的操作,但只有一次,并且具有不同的参数,必须在最后一次“worker”迭代完成之后执行。