zoukankan      html  css  js  c++  java
  • 子线程怎么通知主线程

    其实这个比较简单,子线程怎么通知主线程,就是让子线程做完了自己的事儿就去干主线程的转回去干主线程的事儿。
    那么怎么让子线程去做主线程的事儿呢,我们只需要把主线程的方法传递给子线程就行了,那么传递方法就很简单了委托传值嘛;

    下面有一个例子,子线程干一件事情,做完了通知主线程

    public class Program
    {
    //定义一个为委托
    public delegate void Entrust(string str);
    static void Main(string[] args)
    {
    Entrust callback = new Entrust(CallBack); //把方法赋值给委托
    Thread th = new Thread(Fun);
    th.IsBackground = true;
    th.Start(callback);//将委托传递到子线程中
    Console.ReadKey();
    }
    private static void Fun(object obj) {
    //注意:线程的参数是object类型
    for (int i = 1; i <= 10; i++)
    {
    Console.WriteLine("子线程循环操作第 {0} 次",i);
    Thread.Sleep(500);
    }
    Entrust callback = obj as Entrust;//强转为委托
    callback("我是子线程,我执行完毕了,通知主线程");
    //子线程的循环执行完了就执行主线程的方法
    }
    //主线程的方法
    private static void CallBack(string str) {
    Console.WriteLine(str);
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    上面就是一个通过委托进行向主线程传值(也就是通知主线程)的过程,上面我们是自己定义了一个委托,当然我们也可以使用.NET为我们提供的Action<>和Fun<>泛型委托来处理,就像这样

    public class Program
    {
    //定义一个为委托
    public delegate void Entrust(string str);
    static void Main(string[] args)
    {
    Action<string> callback = ((string str) => { Console.WriteLine(str); });
    //Lamuda表达式
    Thread th = new Thread(Fun);
    th.IsBackground = true;
    th.Start(callback);
    Console.ReadKey();
    }
    private static void Fun(object obj) {
    for (int i = 1; i <= 10; i++)
    {
    Console.WriteLine("子线程循环操作第 {0} 次",i);
    Thread.Sleep(500);
    }
    Action<string> callback = obj as Action<string>;
    callback("我是子线程,我执行完毕了,通知主线程");
    }

    }
    //上面的Lamuda表达式也可以回城匿名函数
    //Action<string> callback = delegate(string str) { Console.WriteLine(str); };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    下面是运行结果

    ————————————————
    版权声明:本文为CSDN博主「NextStand」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/NextStand/article/details/51554167

  • 相关阅读:
    mysqldump 导出数据库为DBname的表名为Tname的表结构 导出数据库的所有表的表结构
    mysqldump 备份某张表 Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions,
    nfs missing codepage or helper program, or other error
    date 增加一个小时 减少一个小时
    mysqldump 备份单个数据库
    mysql删除账户
    怎么删除某个用户的所有帖子?
    mongodb删除重复数据
    ReSharper2018破解详细方法
    激活windows和office
  • 原文地址:https://www.cnblogs.com/liangyuwen/p/14835546.html
Copyright © 2011-2022 走看看