结论:

能, 执行完的线程调用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 = ; i < ; i++)
{
Thread.Sleep();
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

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

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

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

C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗的更多相关文章

  1. 数据泵导入,报错:ORA-12899: value too large for column "SCOTT"."TEST112"."JOIN" (actual: 9, maximum: 8)

    1.报错: 数据泵执行导入时报错:ORA-12899: value too large for column "SCOTT"."TEST112"."J ...

  2. 【DB2】报错:-30090 25000 指定的操作对远程执行失败

    场景描述: 数据库:DB_1,DB_2 现在在DB_1中建立NICKNAME为CST_INFO_NICK,并且该别名指向数据库DB_2的CST_INFO表,在DB_1中建立存储过程,该存储过程需要  ...

  3. MySQL JOIN操作报错问题小解

    1 问题描述 在调用一个MySQL存储过程的时候,有时候会出现下面的错误: Illigal mix of collations(gbk\_chinese\_ci, IMPLICIT) and (lat ...

  4. kubeadm join 超时报错 error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition

    解决: swapoff -a kubeadm reset systemctl daemon-reload systemctl restart kubelet iptables -F && ...

  5. pip install –r ./requirements.txt 报错 改成 pip install -r requirements.txt 成功

    Invalid requirement: '–r'Traceback (most recent call last): File "/home/dev/.pyenv/versions/3.6 ...

  6. CentOS7设置SVN自启动,提交报错,无权限.手动kill掉后重启,成功.

    参考文档:http://tieba.baidu.com/p/5174054662 最近想尝试在CentOS7上搭建SVN服务.遇到的问题大致如题,我这边再详细描述一下. 虚拟机:VMware® Wor ...

  7. YAML_07 有报错信息,告诉你错误忽略,继续执行下面的命令

    ansible]# vim user5.yml --- - hosts: cache   remote_user: root   vars:     user: bb   tasks:    - sh ...

  8. React报错之无法在未挂载的组件上执行React状态更新

    正文从这开始~ 总览 为了解决"Warning: Can't perform a React state update on an unmounted component" ,可以 ...

  9. 【原创】大叔问题定位分享(24)hbase standalone方式启动报错

    hbase 2.0.2 hbase standalone方式启动报错: 2019-01-17 15:49:08,730 ERROR [Thread-24] master.HMaster: Failed ...

随机推荐

  1. Python之爬虫(七)正则的基本使用

    什么是正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是 事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符”,这个“规则字符” 来表达对字符的一种过滤逻辑. 正则并不是pyth ...

  2. Java匿名对象介绍

    Java匿名对象介绍 什么是匿名对象? 顾名思义就是没有变量名的对象,即创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. 匿名对象命名格式:以Scanner类举例 new Scann ...

  3. db2数据库字段更新当前时间

    db2数据库中想要将字段的时间通过sql语句的方式更新: 例如: Update tablename set 字段1='打酱油', 字段2 = TO_CHAR(current timestamp,'YY ...

  4. Ethical Hacking - Web Penetration Testing(11)

    SQL INJECTION Preventing SQLi Filters can be bypassed. Use a blacklist of commands? Still can be byp ...

  5. p44_IP数据包格式

    一.IP数据报格式 二.IP分片 数据链路层每帧可封装数据有上限,IP数据超过的要分片. 标识:同一数据报的分片使用同一标识 标志: 片偏移(13bit):用于还原数据报顺序,指出某片在原分组1中的相 ...

  6. Linux 终端最全推荐(建议收藏)

    本文来自网络整理,如有侵权,则可删除. 如果你跟我一样,整天要花大量的时间使用Linux命令行,而且正在寻找一些可替代系统自带的老旧且乏味的终端软件,那你真是找对了文章.我这里搜集了一些非常有趣的终端 ...

  7. Monster Audio 使用教程(一)入门教程 + 常见问题

    Monster Audio支持的操作系统: windows 7 64bit 至 windows 10 64bit 受支持的VST: Vst 64bit.Vst3 64bit 受支持的声卡驱动: ASI ...

  8. Nexus安装与迁移

    Maven registry(maven私有仓库) 配置Java export JAVA_HOME=/software/jdk1.7.0_79 export JRE_HOME=${JAVA_HOME} ...

  9. ken桑带你读源码之scrapy downloadermiddlewares

    downloadermiddlewares  文件夹是下载中间件 其中  process_request   还没请求时的处理函数 process_response  请求之后的处理函数 chunke ...

  10. 第三章 Java面向对象(上)

    3.1.概述 概述:面向对象是相对面向过程而言,面向对象和面向过程都是一种思想,面向过程强调的是功能行为,面向对象则是将功能封装进对象,强调具备功能的对象,面向对象是基于面向过程的.面向对象的三大特征 ...