C#多线程等待回调

此处介绍一下 AutoResetEvent的方法

下面贴一下微软自带的一个方法。

using System;
using System.Threading;

class ZLP_TEST
{
    static AutoResetEvent autoEvent = new AutoResetEvent(false);

    static void Main()
    {
        Console.WriteLine("Main starting.");

        ThreadPool.QueueUserWorkItem(
            new WaitCallback(WorkMethod), autoEvent);

        // Wait for work method to signal.
        autoEvent.WaitOne();
        Console.WriteLine("Work method signaled.\nMain ending.");
        Console.ReadKey();
    }

    static void WorkMethod(object stateInfo) 
    {
        Console.WriteLine("Work starting.");

        // Simulate time spent working.
        Thread.Sleep(10000);
        
        // Signal that work is finished.
        Console.WriteLine("Work ending.");
        ((AutoResetEvent)stateInfo).Set();
    }
}

这样点击后就是

Paste_Image.png

sleep十秒后

Paste_Image.png

我们会注意到里面有个方法

ThreadPool.QueueUserWorkItem(
            new WaitCallback(WorkMethod), autoEvent);

此处这个方法可以替换带参数启动一个new Thread。 上面这个方法已经非常简练,建议这么使用,下面这个方法挺繁琐的。
下面的方法其实也是带参数新建线程的一个方法。

我们先新建一个类

public class Test
        {
            AutoResetEvent autoEvent;
            public Test(AutoResetEvent autoevent)
            {
                autoEvent = autoevent;
            }
            public void WorkMethod()
            {
                Console.WriteLine("Work starting.");

                // Simulate time spent working.
                Thread.Sleep(10000);

              
                // Signal that work is finished.
                Console.WriteLine("Work ending.");
                ((AutoResetEvent)autoEvent).Set();
            }

        }

那么将原先工程中的替换一下

using System;
using System.Threading;

class ZLP_TEST
{
    static AutoResetEvent autoEvent = new AutoResetEvent(false);

    static void Main()
    {
        Console.WriteLine("Main starting.");
        //原先的做法
        //ThreadPool.QueueUserWorkItem(
           // new WaitCallback(WorkMethod), autoEvent);
        //目前的做法
            Test a = new Test(autoEvent);
            Thread b = new Thread(new ThreadStart(a.WorkMethod));
            b.Start();
        // Wait for work method to signal.
        autoEvent.WaitOne();
        Console.WriteLine("Work method signaled.\nMain ending.");
        Console.ReadKey();
    }

    static void WorkMethod(object stateInfo) 
    {
        Console.WriteLine("Work starting.");

        // Simulate time spent working.
        Thread.Sleep(10000);
        
        // Signal that work is finished.
        Console.WriteLine("Work ending.");
        ((AutoResetEvent)stateInfo).Set();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,517评论 1 15
  • 写在前面的话: 这篇博客是我从这里“转载”的,为什么转载两个字加“”呢?因为这绝不是简单的复制粘贴,我花了五六个小...
    SmartSean阅读 4,818评论 12 45
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,825评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,224评论 19 139
  • 朋友 别再被免费思维给残害了 人人都喜欢免费的东西。 互联网的一个核心模式就是免费。 然而所有真正免费的东西,人们...
    彭先生的杂货铺阅读 176评论 0 3