📜  在C#中加入线程

📅  最后修改于: 2021-05-29 22:12:12             🧑  作者: Mango

在C#中,Thread类提供Join()方法,该方法允许一个线程等待,直到另一个线程完成其执行。如果t是当前正在执行其线程的Thread对象,则t.Join()会导致当前线程暂停其执行,直到它加入的线程完成其执行为止。
如果有多个线程调用Join()方法,这意味着联接上的重载允许程序员指定等待时间。但是,与睡眠一样,Join依赖于操作系统进行计时,因此您不应假定Join将完全按照您指定的时间等待。

Thread.Join()方法的重载列表中有三种方法,如下所示:

  • Join()方法:此方法阻塞调用线程,直到此实例表示的线程终止,同时继续执行标准COM和SendMessage泵送。

    句法:

    public void Join ();
  • Join(Int32)方法:此方法将阻塞调用线程,直到此实例表示的线程终止或在继续执行标准COM和SendMessage泵送过程中经过了指定的时间为止。

    句法:

    public bool Join (int millisecondsTimeout);
  • Join(TimeSpan)方法:此方法将阻塞调用线程,直到此实例表示的线程终止或在继续执行标准COM和SendMessage泵送过程中经过了指定的时间为止。

    句法:

    public bool Join (TimeSpan timeout);

范例1:

// C# program to illustrate the 
// concept of Join() method
using System; 
using System.Threading; 
  
public class ExThread 
{ 
  
    // Non-Static method
    public void mythread() 
    { 
        for (int x = 0; x < 4; x++) 
        { 
            Console.WriteLine(x); 
            Thread.Sleep(100); 
        } 
    } 
  
    // Non-Static method
    public void mythread1()
    {
        Console.WriteLine("2nd thread is Working..");
    }
} 
  
// Driver Class
public class ThreadExample 
{ 
    // Main method
    public static void Main() 
    { 
        // Creating instance for
        // mythread() method
        ExThread obj = new ExThread(); 
          
        // Creating and initializing threads 
        Thread thr1 = new Thread(new ThreadStart(obj.mythread)); 
        Thread thr2 = new Thread(new ThreadStart(obj.mythread1)); 
        thr1.Start(); 
          
        // Join thread
        thr1.Join(); 
        thr2.Start(); 
          
    } 
} 

输出:

0
1
2
3
2nd thread is Working..

说明:在上面的示例中,我们有一个名为ExThread的类,并且该类包含一个非静态方法,即mythread()mythread1() 。因此,我们创建了一个实例,即ExThread类的obj并在ThreadStart类的构造函数中引用了它。使用Thread thr1 = new Thread(new ThreadStart(obj.mythread));语句,我们创建一个名为thr1的线程并初始化该线程的工作,类似于thr2 。通过使用thr1.Join();语句,我们将把thr2的调用发送到等待状态,直到thr1线程的工作完成。此后, thr2线程执行。

范例2:

// C# program to illustrate the
// concept of Join() method
using System;
using System.Threading;
   
class GFG {
   
    // Creating TimeSpan for thread
    static TimeSpan mytime = new TimeSpan(0, 0, 1);
   
    // Main method
    public static void Main()
    {
        // Creating and initializing new thread
        Thread thr = new Thread(mywork);
        thr.Start();
   
        if (thr.Join(mytime + mytime)) {            
            Console.WriteLine("New thread is terminated");
        }
        else {
            Console.WriteLine("Join timed out");
        }
    }
   
    static void mywork()
    {
        Thread.Sleep(mytime);
    }
}

输出:

New thread is terminated

参考:

  • https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.thread.join?view=netframework-4.7.2