繁体   English   中英

C#等待其他线程

[英]C# wait for other threads

我没有找到能够适应我的问题的答案。

这就是这种情况:我需要测试12个网络摄像机的功能,所有这些工作都相同。 因此,我正在启动12个线程,并连接到摄像机。

每个线程都在发送一个激活命令,然后等待10秒钟以获取响应,这是不希望的。

在这10秒钟之后,线程应进入等待状态并通知主线程有关此信息。

一旦所有12个线程都处于等待状态,就通过串行连接发送命令,并且线程应继续其工作。 现在他们应该会得到答案。

到目前为止,我已经启动了12个线程,但是我不知道如何在这一点上使它们同步。

有什么帮助吗?

到目前为止的代码:

Dictionary<String, Thread> tl = new Dictionary<String, Thread>();
Thread t;
foreach (String ip in this.ips) {
    t = new Thread(new ParameterizedThreadStart(camWorker));
    tl.Add(ip, t);
    tl[ip].Start();
}

但是,如果需要,可以将其重建以为每个线程创建单独的类实例。

您可以使用重置事件。 为每个线程创建一个重置事件,最后,等待所有12个重置事件完成。

例:

var resetEvents = new List<AutoResetEvent>();
for (int i = 0; i < 12; i++)
{
   var re = new AutoResetEvent(false);
   resetEvents.Add(re);

   ThreadPool.QueueUserWorkItem(w =>
   {
       var threadReset = w as AutoResetEvent;
       var random = new Random();
       try
       {
          // do something.
          Thread.Sleep(random.Next(100, 2000));
       }
       catch (Exception ex)
       {
          // make sure you catch exceptions and release the lock.
          // otherwise you will get into deadlocks
       }

       // when ready:
       Console.WriteLine("Done thread " + Thread.CurrentThread.ManagedThreadId);
       threadReset.Set();
    }, re);
}

// this bit will wait for all 12 threads to set
foreach (AutoResetEvent resetEvent in resetEvents)
{
   resetEvent.WaitOne();
}

// At this point, all 12 of your threads have signaled that they're ready.
bool[] timeout = new bool[12];
bool waitForSignal = true;
oneof12()
{
    while(true)
    {
        if(receivedatabeforetimeout())
        {


        }
        else
            timeout[0] = true;
        while(waitForSignal)
            Thread.Sleep(500);
    }
}

watcherThread()
{
    bool allTimeout = true;
    for(int a = 0; a<12;a++)
        if(!timeout[0])
            allTimeout = false;

    if(allTimeout)
    {
        for(int a = 0; a<12;a++)
            timeout[a] = false;
        waitForSignal = false;
    }
Thread.Sleep(200);
}

这样的事情适合您的情况吗? 如果超时,则12个线程中的每个线程都会将bool数组中的索引设置为true。 监视线程检查bool数组是否全部12个都超时,并且是否将其设置为true,从而将waitForSignal标志设置为true,这将导致12个线程退出while循环并再次等待数据

这听起来像是Tasks的好案例。 本质上,您可以等待12个任务,每个任务都检查一台摄像机的状态。 这样做的好处是您不必管理独立线程。

using System.Linq;
using System.Threading.Tasks;

...

var Tasks = this.ips.Select(ip => Task.Run(() => Check(ip))).ToArray();

Task.WaitAll(Tasks);

//inspect Task.Result to display status and perform further work

请注意,您的Check方法可以返回结果,然后可以通过Task.Result访问。 Task.WaitAll阻止当前线程,直到所有任务运行完毕。

目前尚不清楚您将从何处调用此代码,但是如果合适,您也可以使用C#的异步功能。

我建议为此使用任务。

List<Task> tasks = new List<Task>();

for (int i=0; i<10; i++)
{
    tasks.Add(Task.Factory.StartNew(() => DoSomething());
}

Task.WaitAll(tasks);

这将使所有任务在后台并行运行,并将等待所有任务完成才能继续。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM