[英]C# Multithreading - Threads don't run
我正在用通常的C ++编程自学C#,现在正在做线程。
下面的简单代码可以正常编译,并且应该在30秒钟内通过线程在循环中发出蜂鸣声。
using System;
using System.Runtime.InteropServices;
using System.Threading;
class BeepSample
{
[DllImport("kernel32.dll", SetLastError=true)]
static extern bool Beep(uint dwFreq, uint dwDuration);
static void Main()
{
Console.WriteLine("Testing PC speaker...");
for (uint i = 100; i <= 20000; i++)
{
var BeepThread = new Thread(delegate() { Beep(i, 30000); });
}
Console.WriteLine("Testing complete.");
Console.ReadLine();
}
}
唯一的问题是线程似乎不起作用。
我知道我缺少一些基本知识。
有任何想法吗?
您忘记启动线程MSDN链接
for (uint i = 100; i <= 20000; i++)
{
var BeepThread = new Thread(delegate() { Beep(i, 30000); });
BeepThread.Start();
}
但是,这看起来很可疑。 为什么需要19900个线程? 可能您想拥有1个线程,该线程内部有一个循环并暂停一小段时间,以通过蜂鸣器输出不同的频率。
唯一的问题是线程似乎不起作用。
从这一部分可以清楚地看到,您尚未启动线程以使它们执行任何操作
代码还有许多其他问题:
关闭问题,需要进一步修改
for (uint i = 100; i <= 20000; i++) { int icopy = i; var BeepThread = new Thread(delegate() { Beep(icopy, 30000); }); BeepThread.Start(); }
Thread
类将启动foreground threads
并且每个逻辑处理器内核具有一次处理一个线程的能力,并且每个Thread
都是computation and memory
的非常昂贵的资源,因为它需要分配Thread Environment Block, Kernel Stack Memory, User Stack Memory
,即使当前代码运行,它也会杀死您的系统,并且您大部分都必须杀死从中退出的进程
Console.ReadLine();
将仅阻塞Main Thread / Ui Thread
,即使Main thread / Ui thread
退出但未被阻塞,其他线程也将继续运行,阻塞的理想方法是在每个线程对象上调用Join
,这将要求主线程等待,直到其完成
重写同一代码的首选方法之一是使用任务并行库:
Parallel.For(100, 20000, , new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount } i => { int icopy = i; Beep(icopy, 30000); });
好处:
thread pool (Background threads)
并且仅使用所需数量的线程,并且最大数量永远不会超过系统的Processor count
,并且由于没有重大的长期运行计算而被重用,因此最大数量将大大减少 Main thread / Ui Thread
好,谢谢大家 已经去吃午饭了。
我实现了...
for (uint i = 500; i <= 550; i++)
{
uint icopy = i;
var BeepThread = new Thread(delegate() { Beep(icopy, 30000); });
BeepThread.Start();
}
效果很好。
如预料的那样,线程在执行主线程后并未终止,但它确实达到了我想要的效果。
祝福大家。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.