我正在通过我常用的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();
}
}
唯一的问题是线程似乎无法正常工作。
我知道我遗漏了一些基本的东西。
有什么想法吗?
答案 0 :(得分:3)
您忘了启动帖子MSDN link
for (uint i = 100; i <= 20000; i++)
{
var BeepThread = new Thread(delegate() { Beep(i, 30000); });
BeepThread.Start();
}
然而,这看起来很可疑。你为什么需要19900个线程?可能你想要一个线程,里面有一个循环,暂停一段时间,通过蜂鸣器输出不同的频率。
答案 1 :(得分:2)
唯一的问题是线程似乎不起作用。
从未启动线程的部分可以清楚地看出这一点
代码还有许多其他问题:
关闭问题,需要进一步修改
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
非常昂贵的资源。 1}}因为它需要Thread Environment Block, Kernel Stack Memory, User Stack Memory
的分配,即使它运行,当前的代码也会杀死你的系统而你大部分时间都要杀掉它的进程
Console.ReadLine();
只会阻止Main Thread / Ui Thread
,即使Main thread / Ui thread
退出且未被阻止,其他正在进行的线程也会继续运行,理想的阻止方式是调用{{1}在每个Thread对象上,它将要求主线程等到完成
重写相同代码的首选方法之一是使用任务并行库:
Join
优点:
Parallel.For(100, 20000,
, new ParallelOptions { MaxDegreeOfParallelism =
Environment.ProcessorCount }
i =>
{
int icopy = i;
Beep(icopy, 30000);
});
上工作并且仅使用所需数量的线程,并且最大数量永远不会超过系统的thread pool (Background threads)
,并且由于线程被重复使用,因此大多数都会少一些,因为没有长时间运行计算Processor count
答案 2 :(得分:0)
好的,谢谢你们。已经去吃午饭了。
我实施了......
for (uint i = 500; i <= 550; i++)
{
uint icopy = i;
var BeepThread = new Thread(delegate() { Beep(icopy, 30000); });
BeepThread.Start();
}
哪个效果很好。
正如预测的那样,线程在主线程执行后没有终止,但它实现了我想要的功能,这很棒。
祝福所有人。