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 = ; 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吗的更多相关文章
- 数据泵导入,报错: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 ...
- 【DB2】报错:-30090 25000 指定的操作对远程执行失败
场景描述: 数据库:DB_1,DB_2 现在在DB_1中建立NICKNAME为CST_INFO_NICK,并且该别名指向数据库DB_2的CST_INFO表,在DB_1中建立存储过程,该存储过程需要 ...
- MySQL JOIN操作报错问题小解
1 问题描述 在调用一个MySQL存储过程的时候,有时候会出现下面的错误: Illigal mix of collations(gbk\_chinese\_ci, IMPLICIT) and (lat ...
- 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 && ...
- 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 ...
- CentOS7设置SVN自启动,提交报错,无权限.手动kill掉后重启,成功.
参考文档:http://tieba.baidu.com/p/5174054662 最近想尝试在CentOS7上搭建SVN服务.遇到的问题大致如题,我这边再详细描述一下. 虚拟机:VMware® Wor ...
- YAML_07 有报错信息,告诉你错误忽略,继续执行下面的命令
ansible]# vim user5.yml --- - hosts: cache remote_user: root vars: user: bb tasks: - sh ...
- React报错之无法在未挂载的组件上执行React状态更新
正文从这开始~ 总览 为了解决"Warning: Can't perform a React state update on an unmounted component" ,可以 ...
- 【原创】大叔问题定位分享(24)hbase standalone方式启动报错
hbase 2.0.2 hbase standalone方式启动报错: 2019-01-17 15:49:08,730 ERROR [Thread-24] master.HMaster: Failed ...
随机推荐
- Python之常用模块学习(二)
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- [Android] keytools生成jsk文件以及获取sha1码
生成jks文件 进入要生的jks文件的路径,打开windows的命令提示符(CMD) keytool -genkey -alias dct -keyalg RSA -keysize 1024 -key ...
- 【高性能Mysql 】读书笔记(三)
第5章 创建高性能的索引 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 索引基础 索引的重要性:找一本800面的书的某一段内容,没有目录也没有页码(页码也可类比 ...
- Linux下显示运行时链接(运行时加载)
目录 介绍 如何加载动态库 dlopen() 第一个参数: 被加载动态库的路径 第二个参数: flag表示函数符号的解析方式 dlopen 返回值 dlsym() 参数: 返回值 符号优先级 dler ...
- Java多线程原理+基础知识(超级超级详细)+(并发与并行)+(进程与线程)1
Java多线程 我们先来了解两个概念!!!! 1.什么是并发与并行 2.什么是进程与线程 1.什么是并发与并行 1.1并行:两个事情在同一时刻发生 1.2并发:两个事情在同一时间段内发生 并发与并行的 ...
- Maven如何利用父工程对版本进行统一管理
项目开发中我们该怎么对项目依赖的版本进行统一管理呢 答:创建一个父级工程,让所有的业务模块都继承该父级工程,即所有的业务都为Module 在父级工程pom文件添加<dependencyManag ...
- day10:函数的实参&形参
函数的参数 (参数:配合函数运算的值)参数: (1)形参:形式参数,在函数的定义处 (2)实参:实际参数,在函数的调用处 形参: 普通形参(位置) , 默认形参 , 普通收集形参 ...
- k8s极简史:K8s多集群技术发展的历史、现状与未来
引子 随着云原生技术的普及,越来越多的企业使用Kubernetes来管理应用,并且集群规模也呈爆发式增长,企业也亟需应对随集群规模增长而带来的各种挑战.同时,为了更好地提供高可用.弹性伸缩的应用,企业 ...
- C++语法小记---经典问题之一(一个空类包含什么)
问题:一个空类包含什么 空的构造函数 拷贝构造函数(浅拷贝) 重载赋值操作符函数(浅拷贝) 析构函数 取址运算符 取址运算符const 注意 所有的这些默认函数,只有在代码中调用了才会生成,否则也不会 ...
- 一起聊聊PHP的几个设计模式
工厂模式 1.简单工厂模式 目的 简单工厂模式是一个精简版的工厂模式. 它与静态工厂模式最大的区别是它不是『静态』的.因为非静态,所以你可以拥有多个不同参数的工厂,你可以为其创建子类.甚至可以模拟 ...