用于ThreadPool.QueueUserWorkItem的C#多CPU

时间:2010-04-06 16:17:28

标签: c# queueuserworkitem

我有一个程序使用:

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();

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

编辑:当你说你正在播放一系列声音时,你的意思是说你试图播放一个接一个的声音,或者你正试图播放一堆声音听起来都在同一时间?

答案 2 :(得分:0)

你究竟看到了什么?

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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