【问题标题】:C# WaitHandle.WaitAll() is always waitingC# WaitHandle.WaitAll() 总是在等待
【发布时间】:2012-11-15 06:34:13
【问题描述】:

以下是我的代码,wait all 方法一直在等待。

  class Program
    {
        static StreamWriter _fileStream;
        static void Main(string[] args)
        {
            _fileStream = File.CreateText(@"C:\Praveen\HelloThread.txt");
            List<ManualResetEvent> meList = new List<ManualResetEvent>();
            ManualResetEvent currentEvent = new ManualResetEvent(true);
            ManualResetEvent nextEvent = new ManualResetEvent(false);
            meList.Add(currentEvent);
            int length = 10;
            Data data = null;
            Console.WriteLine("Writing started...");
            for (int i = 0; i < length; i++)
            {
                data = new Data { CurrentEvent = currentEvent, Number = i, NextEvent = nextEvent };
                ThreadPool.QueueUserWorkItem(PrintMsg, data);
                meList.Add(nextEvent);
                currentEvent = nextEvent;
                nextEvent = nextEvent = new ManualResetEvent(false);
            }

            CloseAll(meList);
            Console.ReadLine();
        }

        private static void CloseAll(List<ManualResetEvent> meList)
        {
            Console.WriteLine("Requested to close all...");
            while (WaitHandle.WaitAll(meList.ToArray()))
            {

            }

            Console.WriteLine("Done with the writing...");
        }

        private static void PrintMsg(object state)
        {

            Data data = state as Data;

            data.CurrentEvent.WaitOne();

            string msg = "Hello times...";
            for (int j = 0; j < 5; j++)
            {
                _fileStream.WriteLine(msg + data.Number);
                Console.WriteLine(msg + data.Number);
            }           
            data.NextEvent.Set();
        }
    }

    public class Data
    {
        public ManualResetEvent CurrentEvent { get; set; }
        public ManualResetEvent NextEvent { get; set; }
        public int Number { get; set; }
    }

发生了什么,为什么总是在等待,知道吗?

【问题讨论】:

  • 当我看到这样的代码时 nextEvent = nextEvent = new ManualResetEvent(false);我倾向于认为作者并没有真正把自己的代码看得太难。目前尚不清楚您实际上要做什么。
  • 这样做的最终目标是什么?您正在启动线程但序列化它们的工作,这看起来更像是生产者-消费者,您可以有一个工作线程并使用 ConcurrentQueue 来存储您的工作项。

标签: c#


【解决方案1】:

您的CloseAll 方法中有一个无限循环。当所有事件都发出信号时,WaitAll 返回true。您不需要空的while循环,只需添加以下行:

WaitHandle.WaitAll(meList.ToArray());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多