首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#线程同步

问C#线程同步
EN

Stack Overflow用户
提问于 2011-12-22 08:12:01
回答 3查看 1.6K关注 0票数 2

我对C#线程有一个问题。

  1. 我有无穷无尽的过程“工人”,做一些和迭代后睡眠3秒。
  2. 我有一个在给定时间运行的计时器函数。

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

我怎么能这么做?向保罗问好

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-22 14:23:25

您可以使用等待句柄来控制方法--类似于:

代码语言:javascript
复制
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)控制在其他线程上运行的方法。

票数 3
EN

Stack Overflow用户

发布于 2011-12-22 08:25:17

您可以在另一个线程正在执行某些操作时使用lock暂停线程:

代码语言:javascript
复制
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);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2011-12-22 08:38:44

你需要工人的同级工作和其他手术吗?如果没有,你也可以做一些类似的事情:

代码语言:javascript
复制
EventWaitHandle processAnotherOperationOnNextIteration = new EventWaitHandle(false, EventResetMode.ManualReset);

Worker() 
{
   while(true)
   {
       doLongOperation();
       if (processAnotherOperationOnNextIteration.WaitOne(0))
       {
           processAnotherOperationOnNextIteration.Reset();
           doAnotherOperation();
       }
       Thread.Sleep(3000);
   }
}

内定时器

代码语言:javascript
复制
 void Timer()
 {
    processAnotherOperationOnNextIteration.Set();
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8601024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档