• C#多线程基础,适合新手了解


    一、创建线程

      在整个系列文章中,我们主要使用Visual Studio 2015作为线程编程的主要工具。在C#语言中创建、使用线程只需要按以下步骤编写即可:

    1、启动Visual Studio 2016,新建一个控制台应用程序。

    2、确保该控制台程序使用.NET Framework 4.6或以上版本。然而在该篇中的所有示例使用较低版本可以正常工作。

    3、双击打开该控制台应用程序中的“Program.cs”文件,在其中编写如下代码:

    using System;
      using System.Threading;
      using static System.Console;
      
      namespace Recipe01
      {
          class Program
          {
              static void PrintNumbers()
             {
                 WriteLine("Starting...");
                 for (int i = 1; i < 10; i++)
                 {
                     WriteLine(i);
                 }
             }
     
             static void Main(string[] args)
             {
                Thread t = new Thread(PrintNumbers);
                 t.Start();
                 PrintNumbers();
             }
         }
     }

      在第2行代码处,我们导入了System.Threading命名空间,该命名空间包含了我们编写多线程程序所需要的所有类型。

      在第3行代码处,我们使用了C# 6.0的using static特性,使用了该特性之后,在代码中允许我们在使用System.Console类型的静态方法的时候不需要指定其类型名。

      在第9~16行代码处,我们定义了一个名为“PrintNumbers”的方法,该方法将在“Main”方法和线程中进行调用。

      在第20行代码处,我们创建了一个线程来运行“PrintNumbers”方法,当我们初始化一个线程时,一个“ThreadStart”或“ParameterizedThreadStart”委托的实例被传递给线程的构造方法。

      在第21行代码处,我们启动线程。

      在第22行代码处,我们在“Main”方法中调用“PrintNumbers”方法。

    4、运行该控制台应用程序,运行效果(每次运行效果可能不同)如下图所示:

    二、中止线程

       在这一节,我们将让线程等待一些时间,在等待的这段时间内,该线程不会消耗操作系统的资源。编写步骤如下:

    1、使用Visual Studio 2015创建一个新的控制台应用程序。

    2、双击打开“Program.cs”文件,编写代码如下所示:

    using System;
      using System.Threading;
      using static System.Console;
      
      namespace Recipe01
      {
          class Program
          {
              static void PrintNumbers()
            {
                 WriteLine("Starting...");
                 for (int i = 1; i < 10; i++)
                 {
                     WriteLine(i);
                 }
             }
     
             static void Main(string[] args)
             {
                 Thread t = new Thread(PrintNumbers);
                 t.Start();
                 PrintNumbers();
             }
         }
     }

    3、运行该控制台应用程序,运行效果(每次运行效果可能不同)如下图所示:

    三、线程等待

       在这一节中,我们将讲述如何在一个线程执行完毕后,再执行剩余的代码,要完成这个工作,我们不能使用Thread.Sleep方法,因为我们不知道另一个线程精确的执行时间。要使一个线程等待另一个线程执行完毕后再进行其他工作,只需要按下列步骤编写代码即可:

    1、使用Visual Studio 2015创建一个新的控制台应用程序。

    2、双击打开“Program.cs”文件,编写如下代码:

    using System;
      using System.Threading;
      using static System.Console;
      using static System.Threading.Thread;
      
      namespace Recipe03
      {
          class Program
          {
            static void PrintNumbersWithDelay()
             {
                 WriteLine("Starting...");
     
               for(int i = 1; i < 10; i++)
                 {
                     Sleep(TimeSpan.FromSeconds(2));
                     WriteLine(i);
                 }
             }
    
             static void Main(string[] args)
            {
                 WriteLine("Starting...");
               Thread t = new Thread(PrintNumbersWithDelay);
              t.Start();
                 t.Join();
                 WriteLine("Thread completed");
             }
        }
    }

    3、运行该控制台应用程序,运行效果如下图所示:

     在第26行代码处,我们在“Main”方法中调用调用“t.Join”方法,该方法允许我们等待线程t执行完毕后,再执行“Main”方法中剩余的代码。有了该技术,我们可以同步两个线程的执行步骤。第一个线程等待第二个线程执行完毕后,再进行其他的工作,在第一个线程等待期间,第一个线程的状态为“bolcked”状态,和我们调用Thread.Sleep的状态一样。

    四、终止线程

      在这一节中,我们将讲述如何终止另一个线程的执行。步骤如下:

    1、使用Visual Studio 2015创建一个新的控制台应用程序。

    2、双击打开“Program.cs”文件,编写如下代码:

     using System;
     using System.Threading;
      using static System.Console;
      using static System.Threading.Thread;
      
      namespace Recipe04
      {
          class Program
          {
             static void PrintNumbers()
             {
                 WriteLine("Starting...");
     
                 for (int i = 1; i < 10; i++)
                 {
                     WriteLine(i);
                 }
             }
     
             static void PrintNumbersWithDelay()
             {
                 WriteLine("Starting...");
                 for (int i = 1; i < 10; i++)
                 {
                     Sleep(TimeSpan.FromSeconds(2));
                     WriteLine(i);
                 }
             }
     
             static void Main(string[] args)
             {
                 WriteLine("Starting program...");
                 Thread t = new Thread(PrintNumbersWithDelay);
                 t.Start();
                 Thread.Sleep(TimeSpan.FromSeconds(6));
                 t.Abort();
                 WriteLine("A thread has been aborted");
                 t = new Thread(PrintNumbers);
                 t.Start();
                 PrintNumbers();
             }
         }
     }

    3、运行该控制台应用程序,运行效果(每次运行效果可能不同)如下图所示:

  • 相关阅读:
    redis
    dom4j-1.6.1.jar与dom4j-1.4.jar
    runoob
    session失效后,登录页面嵌入iframe框架
    log4j.properties 详解与配置步骤
    maven+swagger
    Eclipse建立Maven项目后无法建立src/main/java资源文件夹
    vue 3.x 相对于 vue 2.x 的重大修改
    面试准备
    JS系列
  • 原文地址:https://www.cnblogs.com/ldyblogs/p/thread.html
Copyright © 2020-2023  润新知