zoukankan      html  css  js  c++  java
  • 简单的多线程应用程序

    C#程序默认情况下具有一个线程,代码也都是从上至下逐行执行的。 不过,可以创建辅助线程,以便与主线程一起并行执行代码。 这些线程通常称为“辅助线程”。.NET Framework System.Threading 命名空间使线程更易于使用。


    创建线程


    创建新的 Thread 对象时,将创建新的托管线程。 Thread 类具有接受一个 ThreadStart 委托或 ParameterizedThreadStart 委托的构造函数:该委托包装调用 Start 方法时由新线程调用的方法。 多次调用 Start 将引发 ThreadStateException

    System.Threading.Thread newThread = new System.Threading.Thread(AMethod);

      

    若要开始执行新线程,可使用 Start 方法,

    若要停止执行线程,可使用 Abort 方法,

    除启动和停止线程之外,还可以通过调用 Sleep方法,当前线程立即阻止,阻止时间的长度等于传递给 Thread.Sleep 的毫秒数 ,

     Suspend ()方法挂起线程、使用 Resume 方法继续挂起的线程,(挂起和继续已过时),

    以及使用 Abort 方法销毁线程。

    1 public static void ThreadProc()
    2 {
    3 for (int i = 0; true; i++)
    4 {
    5 Console.WriteLine("ThreadProc: {0}", i);
    6 Thread.Sleep(0);
    7 }
    8 }
    9
    10
    11 static void Main(string[] args)
    12 {
    13 //主线程开始
    14   Console.WriteLine("Main thread: Start");
    15
    16 Thread t = new Thread(new ThreadStart(ThreadProc));
     17
    18 //辅助线程开始
    19   t.Start();
    20
    21 //暂停5毫秒
    22   Thread.Sleep(5);
    23 for (int i = 0; i < 4; i++)
    24 {
    25 Console.WriteLine("Main thread: Do some work.{0}",i);
    26 Thread.Sleep(0);
    27 }
    28 //辅助线程结束
    29   t.Abort();
    30 Console.ReadLine();

    ThreadProc()方法看起来是一个死循环,但是当调用t.Abort()方法就会停止辅助线程,从而结束!

    简单的传参和回调

    1 public class Number
    2 {
    3 private int one;
    4 private int two;
    5
     6
    7 private CallbackCalculate callback;
    8
    9 public Number(int numberOne,int numberTwo,CallbackCalculate callbackDelegate)
    10 {
    11 one = numberOne;
    12 two = numberTwo;
    13 callback = callbackDelegate;
    14 }
    15
    16 public void Calculate()
    17 {
    18 Thread.Sleep(10);
    19 Console.WriteLine(((char)one).ToString()+((char)two).ToString());
    20 if (callback!=null)
    21 {
    22 callback(one + two);
    23 }
    24 }
    25 }
    26
    27 //回调委托
    28   public delegate void CallbackCalculate(int result);
    29
    30
    31 class Program
    32 {
    33 static void Main(string[] args)
    34 {
    35 Number number = new Number(65, 97, new CallbackCalculate(Callback));
    36
    37 Thread t = new Thread(new ThreadStart(number.Calculate));
    38
    39 //表示当前线程是否是后天线程
    40 t.IsBackground = false;
    41
    42 //当前线程优先级
    43 t.Priority = ThreadPriority.Highest;
    44
    45 t.Start();
    46 Console.WriteLine("主线程做一些工作,然后等待");
    47 //使当前线程一直等到另一线程完成
    48 t.Join();
    49 Console.WriteLine("独立的任务已经完成,主线程结束");
    50 Console.ReadLine();
    51 }
    52
    53 private static void Callback(int result)
    54 {
    55 Console.WriteLine("Main Number:{0}",result);
    56 }
    57 }

    需要注意的是主线程和创建的辅助线程都默认是前台线程Thread.IsBackground = false;后台线程与前台线程类似,但后台线程不阻止进程停止。 一旦某个进程的所有前台线程都停止,公共语言运行时就会对仍处于活动状态的后台线程调用 Abort 方法,从而结束该进程。



  • 相关阅读:
    版本控制报告
    Beta—review阶段成员贡献分
    规格说明书-----吉林市一日游
    站立会议---11.16
    本周PSP
    软件需求规格说明书
    非序列化字段与反序列化完成后回调
    不同类型的委托变量的共同类型
    实现IDisposable接口的模式
    序列化和反序列化
  • 原文地址:https://www.cnblogs.com/bizprosdd/p/1905946.html
Copyright © 2011-2022 走看看