C# 举例说明新建的线程,除了abort,是否还有其他结束的方式
时间: 2024-10-27 10:09:28 浏览: 23
在C#中,创建的新线程可以使用Thread类或Task类来管理。除了`Abort()`方法以外,有几种其他方式来结束线程:
1. **加入WaitHandle**:你可以使用CancellationTokenSource来创建一个token,然后将这个token传递给线程。在线程代码里通过检查token.IsCancellationRequested属性来响应取消请求。
```csharp
CancellationTokenSource cts = new CancellationTokenSource();
Thread myThread = new Thread(() =>
{
while (!cts.Token.IsCancellationRequested)
{
// 线程工作逻辑
}
});
myThread.Start();
// 当需要结束线程时
cts.Cancel();
```
2. **`Thread.Join()`**:如果你知道线程ID,可以直接调用`Thread.Join(int millisecondsTimeout)`,线程会在指定时间内等待,如果超时则返回。或者你可以设置无期限地等待直到线程结束,如`myThread.Join()`。
3. **`TaskCompletionSource` 和 `Task`**:对于异步操作,可以使用`Task`和`TaskCompletionSource`。当任务完成或遇到异常时,`Task`会自动终止。
```csharp
using System.Threading.Tasks;
Task task = Task.Run(() => {
// 线程工作
// ...
});
// 要取消任务时
task.CancellationToken?.Cancel();
await task;
```
4. **`Thread.Sleep`**:线程可以在适当的时候暂停并进入睡眠状态,外部代码可以唤醒它,然后结束线程。
```csharp
Thread myThread = new Thread(() =>
{
Thread.Sleep(Timeout.Infinite);
// 如果收到信号或满足特定条件,这里添加代码结束线程
});
myThread.Start();
// ...
myThread.Interrupt(); // 取消睡眠并退出线程
```
阅读全文