C#等待其他线程
本文关键字:线程 其他 等待 | 更新日期: 2023-09-27 18:27:54
我还没有找到能够适应我的问题的答案。
因此,情况如下:我需要测试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。如果所有12个线程都超时了,观察线程会检查bool数组,如果它们超时了,就会将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#的异步功能。
我建议使用Tasks。
List<Task> tasks = new List<Task>();
for (int i=0; i<10; i++)
{
tasks.Add(Task.Factory.StartNew(() => DoSomething());
}
Task.WaitAll(tasks);
这将使所有任务在后台并行运行,并等待所有任务完成后再继续。