2014-10-27 179 views
0

我还没有找到答案我能适应我的问题。C#等待其他线程

所以这是情况: 我需要测试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(); 
} 

但它可以被重建为每个线程创建单独的类的实例,如果这是必需的。

+2

为了适应多线程,您已经完成了哪些工作?即一段代码? – 2014-10-27 13:20:00

+0

已更新问题 – WolleTD 2014-10-27 13:24:50

+0

您是在寻找一种方法来重新唤醒线索或仅保持它们的同步? – Pseudonym 2014-10-27 13:29:33

回答

2

您可以使用reset事件。为每个线程创建一个重置事件,最后等待所有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. 
0
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。观察者线程检查布尔数组,如果所有12个超时,并且如果它们将waitForSignal标志设置为true,这导致12个线程离开while循环并再次等待数据

0

这听起来像一个很好的案例任务。基本上,您可以等待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#的async功能。

0

我建议使用任务为此。

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

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

Task.WaitAll(tasks); 

这将并行运行在后台的所有任务,并会等待,直到他们都完成继续。