C# 等待另一个线程执行到某一行
时间: 2024-09-26 13:05:01 浏览: 37
在C#中,如果你想要让主线程等待另一个线程执行到某一行,可以使用`Monitor.Wait()`、`Task.Wait()`或者`BlockingCollection`等特性来实现同步。这里简单举例:
1. **使用Monitor.Wait()**: 如果你在两个互斥锁保护的线程之间通信,可以这样做:
```csharp
object syncLock = new object();
Monitor.Enter(syncLock);
// 主线程开始
Task.Run(() => {
// 子线程执行任务
// ...
Monitor.PulseAll(syncLock); // 当达到特定行时,释放同步
});
while (!Monitor.IsEntered(syncLock)) {
Monitor.Wait(syncLock); // 主线程在这里等待,直到子线程释放锁
}
// 现在主线程可以继续执行那行代码
```
2. **使用Task.Wait()**: 如果是基于异步的场景,可以创建一个任务并等待它完成:
```csharp
Task task = Task.Run(() => {
// 子线程任务
// ...
return; // 或者设置任务完成
});
task.Wait(); // 主线程阻塞等待任务结束
```
3. **BlockingCollection** (适用于.NET框架4.0及以上) 可以让你的线程池工作线程等待队列中的元素:
```csharp
BlockingCollection<int> collection = new BlockingCollection<int>();
// 子线程添加数据
AddDataToQueue(collection);
int result;
if (collection.TryTake(out result, TimeSpan.FromSeconds(5))) { // 指定等待时间
// 处理结果
} else {
Console.WriteLine("Timed out waiting for data.");
}
```
记得,使用这些技术时要考虑异常处理和资源清理,避免死锁等问题。
阅读全文