【问题标题】:C# multi CPU for ThreadPool.QueueUserWorkItemThreadPool.QueueUserWorkItem 的 C# 多 CPU
【发布时间】:2011-02-04 21:32:45
【问题描述】:

我有一个程序使用:

ThreadPool.QueueUserWorkItem(new WaitCallback(FireAttackProc), fireResult);

在 Windows7 和 Vista 上运行良好。

当我尝试在 XP 上运行它时,结果与其他的有点不同。

我只是想知道为了正确执行 QueueUserWorkItem 我需要双 CPU 系统吗?

我尝试测试的 XP 安装了 .Net 3.5。

欢迎提出意见。

编辑:回调过程播放一系列声音文件。 win7和vista都玩。但在 xp 中只有几个播放。我没有从程序中得到任何异常。

编辑:是的,XP 盒子是单核的。 5岁以上。

编辑:我的应用程序使用 Winsock,我在 XP 机器上运行客户端和服务器。我将尝试在每台机器上运行一个实例,看看它的反应如何。

编辑:你是如何播放声音的?

            SoundPlayer fire = new SoundPlayer(Properties.Resources.fire);
            fire.PlaySync();
            fire.Dispose();

【问题讨论】:

  • 如果您解释“有点不同”的意思以及实际硬件有何不同,可能会有所帮助
  • 如果你直接执行方法(非线程),你的 XP 盒子能正确播放声音吗?
  • @Reed:我的盒子是 Vsta 和 Win7。我从别人那里借了 XP。我想我需要借用更长的时间才能对这个问题进行更多测试。
  • @ikurtz:不幸的是,你没有提供足够的信息来直接说“这是问题所在”......我们只能提示。话虽如此,没有功能差异,因为系统是 XP(就线程而言)。 XP中的音频层不如vista+,所以可能实际上是声音处理,和线程完全无关……

标签: c# queueuserworkitem


【解决方案1】:

主要区别在于,在单核系统上,一次只能运行一个线程。如果您的程序设计正确,这应该没关系,因为操作系统会切换线程的进出并为您管理。

如果您在单核系统上看到了差异,这很可能意味着您的代码中存在竞争条件。唯一的区别应该是它需要更长的时间 - 因为操作系统不能同时运行两个线程。

【讨论】:

    【解决方案2】:

    Vista 和 Windows 7 处理音频的方式与 Windows XP 不同,因此这可能是问题的真正根源(即它与 QueueUserWorkItem 无关)。

    你是如何播放声音的(因为有很多不同的方法可以做到这一点)?

    编辑:当您说您正在播放“一系列”声音时,您的意思是您正在尝试一个接一个地播放声音,或者您正在尝试播放一堆同时发出声音?

    【讨论】:

    • 是的。我的意思是一个接一个,而不是同时一堆。
    • 您是使用 QueueUserWorkItem 调用一次方法,然后一个接一个地播放一堆文件,还是该方法只播放一个文件,而您正在使用 QueueUserWorkItem 调用方法很多次?
    【解决方案3】:

    你到底看到了什么?

    线程计时是不确定的,因此如果您在单处理器机器上运行它,您会看到不同的结果也就不足为奇了。那是因为只有一个核心(没有超线程),一条指令只能一次执行,所以你不会看到真正的并行执行。

    但是,Windows XP 支持多核,就像 Windows 7 或 Vista。我假设您运行它的 XP 机器较旧,并且只有 1 个 CPU?

    【讨论】:

      【解决方案4】:

      您可能会遇到声音文件播放 API 的问题。下面的链接讨论了以非常快的间隔或接近同时使用 C# 应用程序中的 PInvoke 播放多个声音文件的问题。这可能与您的问题相似吗?

      http://www.hanselman.com/blog/CategoryView.aspx?category=BabySmash&page=3

      【讨论】:

        【解决方案5】:

        线程池管理器的行为很重要。它试图小心地避免调度比核心更多的线程。因此,如果您的 XP 机器有一个单核 CPU,它将只允许一个线程运行。只有当线程“卡住”并且没有及时完成时,它才会允许另一个线程启动。这些调度决策每秒进行两次。

        鉴于您使用线程来播放声音,线程池线程不是合适的解决方案。您应该创建自己的线程。

        【讨论】:

          猜你喜欢
          • 2011-02-11
          • 2010-11-19
          • 1970-01-01
          • 2012-06-26
          • 2011-04-03
          • 1970-01-01
          • 2011-09-05
          • 2011-03-04
          • 2014-07-29
          相关资源
          最近更新 更多