C#多线程等待参数变为一继续执行
时间: 2024-10-25 18:05:08 浏览: 13
C#多线程编程中的锁系统(四):自旋锁
在C#中,当一个线程需要等待某个条件满足后再继续执行时,可以使用`Task`或`TaskCompletionSource`以及事件或者`Monitor.Wait()`与`Monitor.Pulse()`方法。这里是一个例子,使用`TaskCompletionSource`:
```csharp
using System;
using System.Threading.Tasks;
public class MainClass
{
private object _syncLock = new object();
private TaskCompletionSource<int> _tcs = new TaskCompletionSource<int>();
public void StartThread(int value)
{
// 创建一个新的任务,该任务将等待TCS完成标志设置为1
Task.Run(async () =>
{
await WaitUntilValueIsOne(value);
Console.WriteLine("Value is one, continuing execution.");
});
}
private async Task WaitUntilValueIsOne(int initialValue)
{
lock (_syncLock)
{
while (initialValue != 1)
{
// 如果初始值不是1,线程进入阻塞状态,直到外部调用SetResult(1)唤醒它
_tcs.WaitOne();
// 检查新的值,可能是外部改变了
initialValue = Interlocked.Exchange(ref _value, initialValue);
}
}
}
// 外部可以改变值并设置TCS完成
public void SetValueToOne()
{
lock (_syncLock)
{
_value = 1; // 更新值
_tcs.SetResult(1); // 设置TCS完成标志
}
}
private int _value; // 共享变量
//
阅读全文