C#使用Threads等待多个条件

时间:2013-06-02 17:43:09

标签: c# multithreading thread-safety

我正在寻找如何实现以下内容的概念: 我有4台设备通过RS232连接到PC,我想创建一些控制应用程序。我已经为处理通信和错误处理的4种不同设备创建了类。

在主线程中,我现在想要创建一些初始化序列。例如,一个控制参数是温度。所以我设定温度,然后需要等待10分钟,直到温度达到。到达时,我想设置电源的输出电压等。我需要并行控制参数(在等待温度进入可接受的窗口时,我还需要监控压力是否在一定范围内)。

所以我梦想着这样的事情,但不知道如何最好地实现它:

Device1.setTemp(200); magic.Wait(获取当前值的函数,包含最小/最大级别的对象,最大时间);

对于简单的情况。但我认为,一旦我知道要走向哪个方向,我可以扩展它以允许监控多个值。

请给我一些好的方向。我已经研究过线程,BackgroudWorkers等等。有许多不同的选择,但我不知道如何从一开始就以安全的方式创建它。

谢谢你, thefloe

1 个答案:

答案 0 :(得分:1)

您可以使用EventWaitHandles来同步线程中的操作。阅读更多here

static EventWaitHandle _go = new AutoResetEvent(false);

static void Main(string[] args)
{
    //Set the temperature 
    int Temp = 100;
    int Voltage = 240;

    Thread t1 = new Thread(() => SetTemperature(Temp) );
    Thread t2 = new Thread(() => SetPowerVoltage(Votage));
    Thread t3 = new Thread(() => SomeOtherImportantWork()); //Which can go on in parallel
    t1.Start();
    t2.Start();
    t3.Start();
    ....
    ....

    //you can wait or do other operations
}

//Logic to set the temperature
static void SetTemperature(int temperature)
{
    Console.WriteLine("Setting temperature");

    //Do your stuff     

    //Signal your other thread
    _go.Set();

}


static void SetPowerVoltage(int voltage)        
{
    //Wait for the temperature to be set
    Console.WriteLine ("Waiting...");
    _go.WaitOne();


    //This will begin execution once the temp thread signals
    //Do your stuff to set voltage

}

static void SomeOtherImportantWork()         
{
     //Do Important work
}