首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NotSupportedException on WaitHandle.WaitAll

NotSupportedException on WaitHandle.WaitAll
EN

Stack Overflow用户
提问于 2010-09-24 05:45:39
回答 3查看 6.2K关注 0票数 4

我正在尝试执行以下代码。代码试图以并行方式下载和保存图像。我传递要下载的图像列表。我用C# 3.0编写了这篇文章,并使用.NET Framework4 (VS.NET速成版)编译了它。每次尝试运行程序时,WaitAll操作都会导致NotSupportedException (不支持STA线程上的多个句柄的WaitAlll)。我试着删除SetMaxThreads,但这并没有什么区别。

代码语言:javascript
复制
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");
}

你能让我明白我遇到了什么问题吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-24 05:58:48

您用[STAThread]属性标记了其中一个方法吗?

票数 5
EN

Stack Overflow用户

发布于 2010-09-24 13:24:24

我建议不要使用多个WaitHandle实例等待完成。使用CountdownEvent类代替。它带来了更优雅和更可伸缩的代码。此外,WaitHandle.WaitAll方法最多只支持64个句柄,不能在STA线程上调用。通过重构您的代码以使用规范模式,我想出了以下内容。

代码语言:javascript
复制
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"); 
} 
票数 7
EN

Stack Overflow用户

发布于 2010-09-24 05:52:10

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

代码语言:javascript
复制
thread.SetApartmentState (System.Threading.Apartmentstate.MTA );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3784510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档