代码之家  ›  专栏  ›  技术社区  ›  rkg

上不支持异常WaitHandle.WaitAll文件

  •  4
  • rkg  · 技术社区  · 14 年前

    我正在尝试执行以下代码。代码尝试并行下载和保存图像。我传递了一个要下载的图像列表。我是用C#3.0写的,用.NETFramework 4编译的(与.NET速成版)。WaitAll操作导致 SetMaxThreads ,但这没什么区别。

    public static void SpawnThreads(List<string> imageList){
        imageList = new List<string>(imageList);
        ManualResetEvent[] doneEvents = new ManualResetEvent[imageList.Count];
        PicDownloader[] picDownloaders = new PicDownloader[imageList.Count];
        ThreadPool.SetMaxThreads(MaxThreadCount, MaxThreadCount);
        for (int i = 0; i < imageList.Count; i++) {
            doneEvents[i] = new ManualResetEvent(false);
            PicDownloader p = new PicDownloader(imageList[i], doneEvents[i]);
            picDownloaders[i] = p;
            ThreadPool.QueueUserWorkItem(p.DoAction);
        }
        // The following line is resulting in "NotSupportedException"     
        WaitHandle.WaitAll(doneEvents);
        Console.WriteLine("All pics downloaded");
    }
    

    谢谢你

    3 回复  |  直到 14 年前
        1
  •  5
  •   Cheng Chen    14 年前

    你在其中一种方法上做了记号吗 [STAThread]

        2
  •  7
  •   Brian Gideon    14 年前

    我建议不要使用多个 WaitHandle CountdownEvent 而不是上课。它产生了更优雅和可伸缩的代码。另外,还有 WaitHandle.WaitAll

    public static void SpawnThreads(List<string> imageList)
    { 
      imageList = new List<string>(imageList); 
      var finished = new CountdownEvent(1);
      var picDownloaders = new PicDownloader[imageList.Count]; 
      ThreadPool.SetMaxThreads(MaxThreadCount, MaxThreadCount); 
      for (int i = 0; i < imageList.Count; i++) 
      { 
        finished.AddCount();    
        PicDownloader p = new PicDownloader(imageList[i]); 
        picDownloaders[i] = p; 
        ThreadPool.QueueUserWorkItem(
          (state) =>
          {
            try
            {
              p.DoAction
            }
            finally
            {
              finished.Signal();
            }
          });
      } 
      finished.Signal();
      finished.Wait();
      Console.WriteLine("All pics downloaded"); 
    } 
    
        3
  •  0
  •   Ruben Bartelink    11 年前

    你试过为线程设置公寓状态吗?

    thread.SetApartmentState (System.Threading.Apartmentstate.MTA );