繁体   English   中英

C#多线程-线程无法运行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM