【发布时间】:2015-07-26 18:54:55
【问题描述】:
我有一个应用程序,其中多个线程必须等待一个事件以指示列表中有新数据可用。我的期望是我可以在每个线程中使用 AutoResetEvent、WaitOne,然后在数据可用时设置事件。
但是,因为它是自动重置的,所以第一个线程会清除事件并且不会释放其他线程。现在我大概可以让它手动重置并实现一个计数器,但我的感觉是这是一个常见的问题,所以必须有一个标准的方法来做到这一点,但是搜索我找不到的文档。
有什么帮助吗?下面是一些不释放所有线程的示例代码:
static AutoResetEvent eve = new AutoResetEvent(false);
static void Main(string[] args)
{
var threads = new List<Thread>();
for (int i = 0; i < 10; ++i)
{
int iCopy = i;
var t = new Thread(() => thread(iCopy));
threads.Add(t);
t.Start();
}
Console.WriteLine("Pausing");
Thread.Sleep(5000);
eve.Set();
foreach (var t in threads) t.Join();
Console.WriteLine("All done");
Console.ReadKey();
}
static void thread(int n)
{
eve.WaitOne();
Console.WriteLine("Thread {0}", n);
}
【问题讨论】:
-
您似乎在寻找 CountdownEvent 或 Semaphore
-
或
ManualResetEvent。
标签: c# multithreading