c# 线程等待变量的值符合条件

在C#中,如果你想让一个线程等待直到某个变量的值满足特定条件,你可以使用ManualResetEvent或者AutoResetEvent来实现线程间的同步。以下是使用AutoResetEvent实现的一个简单例子:

在这个例子中,同时实现了如何让static函数访问非static函数/变量,因为本来static函数是无法访问this或者非static函数/变量,需要一个中间值instance才能实现,具体看代码。这是我自己摸索出来的办法,如果大家有更好的办法,欢迎评论区留言。

cs 复制代码
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对象_autoResetEventAutoResetEvent默认在未触发状态下构造,即 _autoResetEvent.Set() 必须被调用后 _autoResetEvent.WaitOne() 才会返回。

WorkerThreadProc 是工作线程的入口点,它会等待直到主线程调用 _autoResetEvent.Set() 触发事件。一旦事件被触发,工作线程会继续执行并打印出变量的值。

请注意,这个例子中的同步机制非常简单,它适用于演示目的。在实际的应用程序中,变量的等待往往是跨模块的,你可能需要更复杂的同步策略,例如使用lock语句来保护共享数据,或者使用Monitor类来实现同步。

相关推荐
编程乐趣18 分钟前
5个yyds的.Net商城开源项目
开源·c#·.net
DanmF--25 分钟前
Protobuf协议生成和使用
网络·unity·c#·游戏引擎·游戏程序
字节源流5 小时前
关于maven的依赖下不下来的问题
java·maven
pjx9876 小时前
服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
java·运维·spring·负载均衡
prinrf('千寻)6 小时前
MyBatis-Plus 的 updateById 方法不更新 null 值属性的问题
java·开发语言·mybatis
老华带你飞6 小时前
实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)
java·数据库·spring boot·小程序·论文·毕设·实习记录小程序
她说彩礼65万7 小时前
C# lock
c#
在未来等你7 小时前
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战
java·微服务·ai·kubernetes·大模型·embedding·spring ai
源码技术栈7 小时前
SaaS基于云计算、大数据的Java云HIS平台信息化系统源码
java·大数据·云计算·云his·his系统·云医院·区域his
编程、小哥哥7 小时前
互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖
java·spring boot·redis·微服务·prometheus·面试技巧