在C#中,如果你想让一个线程等待直到某个变量的值满足特定条件,你可以使用ManualResetEvent
或者AutoResetEvent
来实现线程间的同步。以下是使用AutoResetEvent
实现的一个简单例子:
在这个例子中,同时实现了如何让static函数访问非static函数/变量,因为本来static函数是无法访问this或者非static函数/变量,需要一个中间值instance才能实现,具体看代码。这是我自己摸索出来的办法,如果大家有更好的办法,欢迎评论区留言。
using System;
using System.Threading;
public class Program
{
private static int _variable;
private static AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
private static Program instance = null;
private int m_nTest = 0;
void InitializeInstance()
{
instance = this;
}
public static void Main()
{
//展示在类中如何用this初始化static变量
Program instance = new Program();
instance.InitializeInstance();
instance.m_nTest = 5;
Thread workerThread = new Thread(WorkerThreadProc);
workerThread.Start();
// 修改变量的值,当满足条件时触发事件
_variable = 10;
_autoResetEvent.Set();
Console.WriteLine("主线程结束");
}
private static void WorkerThreadProc()
{
// 等待事件被触发,即变量的值满足条件
_autoResetEvent.WaitOne();
// 执行操作,一旦条件满足
Console.WriteLine($"变量的值为: {_variable}");
if(instance != null)
{
Console.WriteLine($"变量m_nTest的值为: {instance.m_nTest}");
}
}
}
在这个例子中,我们创建了一个名为_variable
的变量和一个AutoResetEvent
对象_autoResetEvent
。AutoResetEvent
默认在未触发状态下构造,即 _autoResetEvent.Set()
必须被调用后 _autoResetEvent.WaitOne()
才会返回。
WorkerThreadProc
是工作线程的入口点,它会等待直到主线程调用 _autoResetEvent.Set()
触发事件。一旦事件被触发,工作线程会继续执行并打印出变量的值。
请注意,这个例子中的同步机制非常简单,它适用于演示目的。在实际的应用程序中,变量的等待往往是跨模块的,你可能需要更复杂的同步策略,例如使用lock
语句来保护共享数据,或者使用Monitor
类来实现同步。