C#笔记10 Thread类怎么终止(Abort)和阻止(Join)线程
Thread类
C#笔记8 线程是什么?多线程怎么实现和操作?-CSDN博客
C#笔记9 对线程Thread的万字解读 小小多线程直接拿下!-CSDN博客
上次说过怎么简单的使用多线程,怎么创建多线程,但是没有具体分析它的终止和释放。
线程的终止
Abort方法
英文意为终止,该方法用于终止线程:
它的方法是引发一个异常,从而跳到终结线程的过程。
在我们的.Net8.0平台,这也是个过时的方法。
Thread myThread = new Thread(mythreaddo);
chattx.Text += "\nthread start";
myThread.Start();
chattx.Text += "\nthread suspend";
// 挂起线程
myThread.Suspend();
chattx.Text += "\nmainthreadsleep start" + DateTime.Now.ToString();
// 等待一段时间或执行其他操作
Thread.Sleep(1000);
chattx.Text += "\nmainthreadsleep over" + DateTime.Now.ToString();
// 恢复线程
myThread.Resume();
myThread.Abort();
myThread.Start();
事实上在线程abort之后就不能再次启动了。如果你执行start方法会导致它报错。
此方法其实也有重载。
public void Abort(Object stateInfo);
public void Abort(object stateInfo)
{
AbortReason = stateInfo;
AbortInternal();
}
传入的参数作为终止的异常信息,可以被正在终止的线程使用。
using System;
using System.Threading;
class Test
{
public static void Main()
{
Thread newThread = new Thread(new ThreadStart(TestMethod));
newThread.Start();
Thread.Sleep(1000);
// Abort newThread.
Console.WriteLine("Main aborting new thread.");
newThread.Abort("Information from Main.");
// Wait for the thread to terminate.
newThread.Join();
Console.WriteLine("New thread terminated - Main exiting.");
}
static void TestMethod()
{
try
{
while(true)
{
Console.WriteLine("New thread running.");
Thread.Sleep(1000);
}
}
catch(ThreadAbortException abortException)
{
Console.WriteLine((string)abortException.ExceptionState);
}
}
}
但是在我们的.Net Framework 4.7.2也就是我们的winform的C#7.3中,此代码输出结果不太一样,而且join会影响我们的界面线程导致我们的数据无法输出。
这里我们就先不探究,只要知道怎么使用Abort方法即可。
Join()方法
此方法用于阻止调用线程,直到某个线程终止为止。意思是让当前线程等待另外一个线程执行完毕。
怎么理解呢:
它有三种重载:
Join()
在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻止调用线程,直到由该实例表示的线程终止。
Join(Int32)
在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻止调用线程,直到由该实例表示的线程终止或经过了指定时间为止。
Join(TimeSpan)
在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻止调用线程,直到由该实例表示的线程终止或经过了指定时间为止。
示例代码
static void Main()
{
Thread myThread = new Thread(DoWork);
myThread.Start();
// 等待线程完成
myThread.Join();
}
static void DoWork()
{
// 执行线程任务
Thread.Sleep(1000); // 假设线程需要1秒来完成工作
}
在这个例子中,我们创建了一个名为 myThread 的线程,并启动了它。我们使用 myThread.Join() 方法等待 myThread 完成其任务。只有当 myThread 完成其工作或被终止时,Join 方法才会返回。
永远不要从当前 Join 线程调用 表示当前线程的 对象的 方法 Thread 。 这会导致应用无响应,因为当前线程无限期地等待自身,
join方法的重载和sleep一样支持int32和timespan。都是用来表示等待的最大时间。