WaitHandle.WaitAll 上的 NotSupportedException

2023-12-12

我正在尝试执行以下代码。该代码尝试并行下载和保存图像。我传递了要下载的图像列表。我用 C# 3.0 编写了此代码,并使用 .NET Framework 4(VS.NET Express 版本)对其进行了编译。 WaitAll 操作会导致NotSupportedException(不支持 STA 线程上多个句柄的 WaitAlll)每次我尝试运行我的程序时。我尝试删除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");
}

您能让我了解我遇到的问题是什么吗?

谢谢


我建议不要使用多个WaitHandle等待完成的实例。使用倒计时活动类代替。它会产生更优雅和可扩展的代码。另外,WaitHandle.WaitAll方法仅支持最多 64 个句柄,并且不能在 STA 线程上调用。通过重构代码以使用规范模式,我想出了这个。

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"); 
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WaitHandle.WaitAll 上的 NotSupportedException 的相关文章

  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 私有模板函数

    我有一堂课 C h class C private template
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • 在 Goutte 中设置代理

    我尝试过使用 Guzzle 的文档来设置代理 但它不起作用 Goutte 的官方 Github 页面已经死了 所以在那里找不到任何东西 有人知道如何设置代理吗 这是我尝试过的 client new Client client gt setH
  • 如何将 Prompt.Choice() 的结果转发到当前对话框?

    我在用着PromptDialog Choice 向我的用户提供不同的选项 尝试次数设置为 0 因此如果他们输入任何无效选项 则不会进行任何重试 在这种情况下 我想将输入的文本传递给当前的对话框 该对话框已呈现提示并让它处理消息 这样做的正确
  • 使用 GitHub API 在一次提交中编辑多个文件

    我在 C Web 应用程序 使用 Blazor 中使用 GitHub API 我希望能够创建单个提交来添加 删除和编辑存储库中文件夹中的多个文件 我知道我可以向该 URL 发送 PUT 请求https api github com repo
  • 结构体和相应变量的大小

    如果我定义一个 char 变量 char a 以及具有单个 char 成员的结构 struct OneChar char a 这两个定义在所有编译器中都具有 char 的大小吗 我的疑问是 如果我们在结构体中定义一个 char 变量 由于内
  • PHP 中确定文件是否为图像的最佳方法是什么?

    我有一个人们可以上传文件的服务器 问题是某些文件名被破坏 没有任何扩展名 因此我无法立即确定文件类型 这个问题分为两部分 对于有文件名的文件 确定它是否是图像的最佳方法是什么 只是一个很长的if else if列表 其次 对于没有扩展名的文
  • 根据邮政编码自动填充国家和城市,反之亦然

    我正在尝试制作一个需要地址和邮政编码的简单表单 所以我想知道是否有一种方法可以根据用户已经输入的内容自动填充这些字段 例如 如果他决定仅输入邮政编码 则城市和国家字段将自动填充 反之亦然 经过一段时间的搜索后 我发现了这些我可能会使用的数据
  • Android:如何在子活动中使用从父活动传递的数据?

    当我们想要将数据从活动传递到子活动时 我们使用 intent pushextra 方法并传递请求代码和任何附加数据 现在在子活动中如何获取附加数据或请求代码 有没有任何事件处理程序可以处理这个问题 thanks You use intent
  • 如何在 Visual Studio 2010 中编译 CUDA 应用程序?

    如何在 Visual Studio 2010 中编译 CUDA 应用程序 这是我的步骤 1 创建没有预编译头的空C 项目 2 添加main cpp int main return 0 添加 kernels cu 我参考了示例项目MAtrix
  • 如何在使用我的应用程序时禁用所有 iOS 通知横幅?

    有人提出了此问题的 React Native 特定版本 但没有得到解答React Native 当我的应用程序处于活动状态时 如何禁用所有推送通知 本质上 有没有办法消除我的应用程序位于前台时的中断 理想情况下 我会将应用程序置于 焦点 状
  • 更改主窗口背景颜色 WPF

    我正在尝试使用名为 EditColorDialog 的对话框更改 MainWindow 的背景颜色 该对话框可以很好地读取主窗口的当前背景颜色 但我似乎无法让它更改该颜色 public partial class EditColorDial
  • 如何使用剪切路径处理倾斜边缘?

    当前使用此 CSS 实现从左到右向上的底部倾斜 clip path polygon 0 0 100 0 100 calc 100 3vw 0 100 它对于响应式解决方案非常有效 但很难弄清楚如何为响应式解决方案执行此操作 以实现 div
  • 用于多封电子邮件的正则表达式验证器

    我正在验证文本框的有效电子邮件
  • 如何获取设备中存储的所有图像并在iPhone sdk中将它们显示为图库

    我想获取设备中存储的所有图像 并在我的 iPhone 应用程序中将它们显示为图库 UIImagePickerController 以缩略图视图显示所有照片 在选择每张照片时 我们仅获取该特定选定图像的数据 而不是我想一次获取所有照片并将它们
  • 从 Chrome 扩展程序访问 Google Maps API

    假设我想在任何网页上查找地址 然后单击每个地址 在地址下方插入一个小的 Google 地图 我遇到的问题是 GMaps 库必须通过 26631 35760 21152 36733 12290 20294 30001 20110 36890
  • 函数定义还是变量定义?

    为什么编译器将此行解释为函数定义而不是变量定义 Y y X 在下面的代码中 include
  • 如何在Python中左对齐数据框列?

    必须在 python 中将 pandas 数据框中的描述列左对齐 类似于 Excel 工作表中的单元格左对齐或右对齐 有什么解决办法吗 附上图片供参考 Dataset Try this df style set properties sub
  • 无法在运行 AndroidThings 的 Raspberry Pi 上使用 Android Camera (1) API 连接相机

    我正在尝试在运行 Android Things 0 7 版本并附加了 Raspberry Pi Camera V2 的 Raspberry Pi 上运行带有 QR 代码扫描仪的标准 Android 应用程序 该应用程序和二维码扫描仪在大多数
  • 如何查看两个日期时间之间哪个房间可用

    我正在开发一个网络应用程序 可以在其中预订会议室 首先让我向您解释一下我的数据库是什么样子的 我有桌子Reservations具有以下设计 ID gt int ROOMID gt int DATE BEGIN gt DATETIME DAT
  • 在 UIInput 的值中使用 EL 条件运算符时出现 javax.el.PropertyNotWritableException

    我收到此错误消息 javax el PropertyNotWritableException u editProfile xhtml 64 140 value empty userProfile cfg gpu or userProfile
  • WaitHandle.WaitAll 上的 NotSupportedException

    我正在尝试执行以下代码 该代码尝试并行下载和保存图像 我传递了要下载的图像列表 我用 C 3 0 编写了此代码 并使用 NET Framework 4 VS NET Express 版本 对其进行了编译 WaitAll 操作会导致NotSu