我有一个程序使用:
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();
答案 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,它将只允许一个线程运行。只有当线程“卡住”并且没有及时完成时,它才允许另一个线程启动。这些调度决策每秒进行两次。
鉴于您使用线程播放声音,线程池线程不是合适的解决方案。你应该创建自己的线程。