当前位置: 首页 > news >正文

聊透多线程编程-线程基础-4.C# Thread 子线程执行完成后通知主线程执行特定动作

在多线程编程中,线程之间的同步和通信是一个常见的需求。例如,我们可能需要一个子线程完成某些任务后通知主线程,并由主线程执行特定的动作。本文将基于一个示例程序,详细讲解如何使用 AutoResetEvent 来实现这种场景。

示例代码:

using System;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Main thread started.");

        using (AutoResetEvent workDoneEvent = new AutoResetEvent(false))
        {
            // 创建并启动子线程
            Thread workerThread = new Thread(() => DoWork(workDoneEvent));
            workerThread.Start();

            // 主线程继续做其他事情,不会被阻塞
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("Main thread is working...");
                Thread.Sleep(1000);
            }

            // 等待子线程的通知
            int pollInterval = 500; // 轮询间隔(毫秒)
            while (true)
            {
                if (workDoneEvent.WaitOne(0))
                {
                    ExecuteCallback();
                    break;
                }

                Thread.Sleep(pollInterval);
            }
        }

        Console.WriteLine("Main thread finished.");
    }

    static void DoWork(AutoResetEvent workDoneEvent)
    {
        Console.WriteLine("Worker thread started.");
        Thread.Sleep(100); // 模拟工作
        Console.WriteLine("Worker thread finished.");

        // 通知主线程
        workDoneEvent.Set();
    }

    static void ExecuteCallback()
    {
        Thread.Sleep(500); // 模拟动作执行
        Console.WriteLine("Callback is invoked on Main thread.");
    }
}

程序的功能描述

上述代码实现了一个典型的多线程场景:

  1. 主线程启动后,创建并启动一个子线程。
  2. 子线程模拟执行某些工作(通过 Thread.Sleep(100) 模拟耗时操作)。
  3. 子线程完成后,通过 AutoResetEvent 通知主线程。
  4. 主线程收到通知后,执行特定的动作(ExecuteCallback 方法)。

 

 

 

 

相关文章:

  • KWDB创作者计划—KWDB技术重构:重新定义数据与知识的神经符号革命
  • 网络机顶盒常见问题全解析:从安装到故障排除
  • 使用 VBA 宏创建一个选择全部word图片快捷指令,进行图片格式编辑
  • vba讲excel转换为word
  • 从One-Hot到TF-IDF:NLP词向量演进解析与业务实战指南
  • 初版纳米AI_git pull分支关联关系
  • 如何降低论文的AIGC检测率,减少“AI味”
  • CD26.【C++ Dev】类和对象(17) static成员(下)
  • c++进阶之----异常
  • java实体类常用参数验证
  • DepthAI ROS 安装与使用教程
  • 从传统 CLI 到自动化:网管协议( SNMP / NETCONF / RESTCONF)与 YANG
  • Java SE(2)——运算符
  • 艾尔登法环Steam不同账号存档互通方法与替换工具分享
  • nginx入门,部署静态资源,反向代理,负载均衡使用
  • 【基于LangChain的千问大模型工具调用】 Function CallingTool Calling简易示例
  • SCS翠鸟认证是什么,SCS翠鸟认证的意义?对企业发展好处
  • NO.88十六届蓝桥杯备战|动态规划-多重背包|摆花(C++)
  • SpringBoot 基础知识,HTTP 概述
  • 从递归入手一维动态规划