Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#线程同步_C#_Multithreading - Fatal编程技术网

C#线程同步

C#线程同步,c#,multithreading,C#,Multithreading,我对C#线程有问题 我有一个无提示的进程“worker”,它做了一些工作,并在迭代后休眠3秒 我有一个在给定时间运行的计时器函数 我需要“timer函数”做一些事情,然后等待结束“worker”迭代,然后暂停“worker”,直到“timer函数”完成自己的任务,然后计时器函数再次启动“worker” 我该怎么做? 向Paul致意当另一个线程正在执行某项操作时,您可以使用锁来暂停线程: readonly object gate = new object(); void Timer() {

我对C#线程有问题

  • 我有一个无提示的进程“worker”,它做了一些工作,并在迭代后休眠3秒

  • 我有一个在给定时间运行的计时器函数

  • 我需要“timer函数”做一些事情,然后等待结束“worker”迭代,然后暂停“worker”,直到“timer函数”完成自己的任务,然后计时器函数再次启动“worker”

    我该怎么做?
    向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”迭代完成之后执行。