C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗

结论: 

能, 执行完的线程调用Join不会抛出错误。

 

Thread.Join()是什么?

Join()函数用于阻塞地等待线程结束, 其行为是在线程A中调用了线程B的Join()后, 线程A将一直阻塞在该函数处, 直到线程B执行完毕, 线程A才继续执行。

 

详细信息:

采用窗体应用程序对方法进行了测试。

测试思路是, 在构造函数中初始化线程, 线程的行为是不断输出某些信息以此判断线程的运行状态, 在窗体中调用线程中的Start、Join方法。

 

测试用代码:

注:使用了《重定向Console输出到文本框》中提供的TextBoxWriter类型。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Console2TextBox;

namespace ThreadFuncTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Console.SetOut(new TextBoxWriter(textBox1));
            thd = new Thread(new ThreadStart(Beh));
        }

        public Thread thd;

        void Beh()
        {
            for (int i = 0; i < 20; i++)
            {
                Thread.Sleep(500);
                Console.WriteLine("t=" + i);
            }
            Console.WriteLine("fin");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                thd.Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                thd.Join();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                Console.WriteLine(thd.IsAlive.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString()); 
            }
        }
    }
}

 

测试效果 

线程启动前点击Join, 报错, 错误显示不允许在线程未启动时调用Join

C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗_第1张图片

线程启动时点击Join, 窗体卡住, 到一定时间后恢复响应, 输出全部数据(图略)

 

线程执行完成后电机Join, 窗体无任何变化, 这意味着Join能针对已经结束的线程顺利执行。这个特性对线程管理十分有益, 如果会抛出错误, 提前判断线程状态再执行Join则会产生线程状态更替的风险。

 C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗_第2张图片

 

转载记得标出处哦 本文: https://www.cnblogs.com/eehow/p/13425002.html

你可能感兴趣的:(C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗)