C#多线程 - 线程不会运行

时间:2016-08-18 06:29:34

标签: c# multithreading

我正在通过我常用的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();
    }
}

唯一的问题是线程似乎无法正常工作。

我知道我遗漏了一些基本的东西。

有什么想法吗?

3 个答案:

答案 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,并且每个逻辑处理器核心都有能力一次处理一个线程,每个Threadcomputation 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(); 
    }

哪个效果很好。

正如预测的那样,线程在主线程执行后没有终止,但它实现了我想要的功能,这很棒。

祝福所有人。

相关问题