结论:

能, 执行完的线程调用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. 【一起学系列】之命令模式:封装一个简单Jedis

    意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 命令模式的诞生 [产品]:开发小哥,来活啦,咱们需要设计一款遥控器,核心功能就 ...

  2. idea 安装 codota 插件

    为抄代码而生的插件哇,码农们的知心姐姐!!!

  3. Vue全家桶之一Vue(基础知识篇)

    全家桶:Vue本身.状态管理.路由.   异步组件:     

  4. javac不是内部或外部命令,也不是可运行的程序或批处理文件的错误解决方法(Windows10/Windows7)

    前言:在配置JDK环境变量后,java显示正常,javac则显示javac不是内部或外部命令,也不是可运行的程序或批处理文件.造成javac不是内部或外部命令,也不是可运行的程序或批处理文件的问题一般 ...

  5. iOS倒计时button闪烁

    v _button.titleLabel.text = [NSString stringWithFormat:@"%d后重发",t]; [_button setTitle:[NSS ...

  6. 使用SQL语句建表,插入数据

    --选中数据库,点击新建查询,然后执行即可--这是SQL中的注释信息,使用两个减号来注释. drop table Book --删除表Book create table Book --创建表Book ...

  7. ORACLE_19c用户密码登录失败的问题以及ORA-28040

    测试环境19c 本地登录无异常,创建测试用户,电脑Plsql登录提示报错ORA-28040,处理后再次登录提示密码错误,最后重置密码再次登录OK? 通过这个问题再次测试及反思: 1.ORA-28040 ...

  8. 互联网找的e是无理数的初等证明

    e的两种计算方式 \(e=lim_{n \to \infty}(1+\frac{1}{n})^n\) \(e=\sum_{n=0}^{+\infty}\frac{1}{n!}\) \(即,e=\fra ...

  9. python socket函数详解

    关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确.每次都查半天,经常烦恼于此.索性都弄得清楚.通透,并记录下来, ...

  10. Zabbix-server自动发现,批量添加主机,并链接模板

    zabbix可以手动添加agent客户端,当主机数量比较多时,这时手工重复工作会大大增加.zabbix的自动发现功能可以帮我们解决这个问题. 准备条件: 1. 被监控主机都装上zabbix-agent ...