C#用于ThreadPool.QueueUserWorkItem的多CPU
我有一个程序使用:C#用于ThreadPool.QueueUserWorkItem的多CPU,c#,queueuserworkitem,C#,Queueuserworkitem,我有一个程序使用: ThreadPool.QueueUserWorkItem(new WaitCallback(FireAttackProc), fireResult); 在Windows7和Vista上,它工作正常 当我尝试在XP上运行它时,结果与其他的有点不同 我只是想知道,为了正确执行QueueUserWorkItem,我需要一个双CPU系统吗 我试图测试的XP安装了.NET3.5 我非常欢迎 编辑:回调过程播放一系列声音文件。在win7和vista中,它们都可以玩。但在xp中,只有几个
ThreadPool.QueueUserWorkItem(new WaitCallback(FireAttackProc), fireResult);
在Windows7和Vista上,它工作正常
当我尝试在XP上运行它时,结果与其他的有点不同
我只是想知道,为了正确执行QueueUserWorkItem,我需要一个双CPU系统吗
我试图测试的XP安装了.NET3.5
我非常欢迎
编辑:回调过程播放一系列声音文件。在win7和vista中,它们都可以玩。但在xp中,只有几个玩家在玩。我没有从程序中得到任何例外
编辑:是的XP框是单核的。5岁以上
编辑:我的应用程序使用Winsock,我在XP机器上运行客户端和服务器。我将尝试在每台机器上运行一个实例,看看它的反应如何
编辑:你是如何播放这些声音的
SoundPlayer fire = new SoundPlayer(Properties.Resources.fire);
fire.PlaySync();
fire.Dispose();
主要区别在于,在单核系统上,一次只能运行一个线程。如果您的程序设计正确,这应该无关紧要,因为操作系统会切换线程,并为您管理线程
如果您在单核系统上看到差异,这很可能意味着您的代码中存在竞争条件。唯一的区别应该是需要更长的时间,因为操作系统不能同时运行两个线程。你到底看到了什么 线程的计时是不确定的,所以如果在单处理器机器上运行,会看到不同的结果也就不足为奇了。这是因为只有一个内核(没有超线程),一条指令只能一次执行,所以您不会看到真正的并行执行
但是,windows XP支持多核,就像windows 7或Vista一样。我假设您运行它的XP机器比较旧,只有一个CPU?您可能遇到了声音文件播放API的问题。下面的链接讨论了以非常快的间隔播放多个声音文件或几乎同时使用C#app中的PInvoke时出现的问题。这可能与您的问题类似吗
Vista和Windows 7处理音频的方式与Windows XP不同,因此这可能是问题的真正根源(即,它与
QueueUserWorkItem
无关)
你是如何播放这些声音的(因为你可以用很多不同的方法来播放)
编辑:当您说您正在播放一系列声音时,您的意思是您正在尝试播放一个接一个的声音,还是您正在尝试同时播放一组声音?线程池管理器的行为很重要。它试图谨慎地避免调度的线程数超过内核数。因此,如果您的XP机器有一个单核CPU,它将只允许一个线程运行。只有当线程被“卡住”并且没有及时完成时,它才会允许另一个线程启动。这些调度决策每秒进行两次
如果您使用线程来播放声音,那么线程池线程不是合适的解决方案。您应该创建自己的线程。如果您解释一下“稍微不同”的含义,以及实际硬件的不同,可能会有所帮助。如果您直接执行该方法(非线程化),XP box是否能够正确播放声音?@Reed:My box都是Vsta和Win7。我从别人那里借了XP。我想我需要借更长的时间,以便在这个问题上进行更多的测试。@ikurtz:不幸的是,你没有提供足够的信息来直接说“这就是问题所在”。。。我们只能暗示。这就是说,并没有功能上的区别,因为系统是XP(在线程方面)。XP中的音频层没有vista+好,所以它实际上可能是声音处理,与线程无关……是的。我的意思是一个接一个,而不是同时调用一组。您是使用QueueUserWorkItem调用一次方法,然后一个接一个地播放一组文件,还是该方法只播放一个文件,而您使用QueueUserWorkItem多次调用该方法?