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类来实现同步。

相关推荐
Zzzzmo_4 分钟前
Spring MVC
java·spring·mvc·cookie/session
cfm_29147 分钟前
Spring核心设计模式
java·spring·设计模式
Java小白笔记8 分钟前
Java 实现阿里云 OSS 文件上传链路:普通上传、秒传、分片与断点续传
java·开发语言·数据库·spring·阿里云
2333!!!!!14 分钟前
rocket新手一些常见问题
java·开发语言
骇客野人20 分钟前
Springboot 的 配置文件 application.yml 和 bootrap.yml 的由来和作用
java·spring boot·后端
wuminyu23 分钟前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
郝学胜-神的一滴26 分钟前
C++11 工程级应用 08:Lambda表达式与Tuple元组
开发语言·jvm·c++·python·程序人生·开源
CoderYanger31 分钟前
A.每日一题:3622. 判断整除性
java·程序人生·算法·leetcode·面试·职场和发展·蓝桥杯
吴声子夜歌36 分钟前
ApacheCommons——commons-lang3(Java 基础语言增强)(二)
java·开发语言·apache
xcl092536 分钟前
幼儿托管系统开发实战:从需求分析到部署上线全指南
java·spring boot·需求分析