zoukankan      html  css  js  c++  java
  • 多线程:子线程执行完成后通知主线程

    1. 主线程的代码先执行
    2. 再执行子线程
    3. 最后执行主线程的方法

     其实还是主线程执行,再New了一个新线程,然后大家各干个的事了。

     public delegate void Entrust(string str);
            static void Main(string[] args)
            {
                Entrust callback = new Entrust(ShowMesage); //把方法赋值给委托
                Thread th = new Thread(p=> SendResult(callback,"xxx","abc"));
                th.IsBackground = true;
                th.Start(callback);//将委托传递到子线程中
                Console.WriteLine("我是主程序里输出的");
                Console.ReadKey();
            }
    
            private static void SendResult(object obj, string str, string strResult)
            {
                try
                {
                    //注意:线程的参数是object类型
                    for (int i = 1; i <= 10; i++)
                    {
                        Console.WriteLine("子线程循环操作第 {0} 次", i);
                        Thread.Sleep(500);
                    }
                    throw new Exception("子线程报错了");
                }
                catch (Exception ex)
                {
                    Entrust callback = obj as Entrust;//强转为委托
                    callback("我是子线程,我执行完毕了,通知主线程:"+ex.Message);
                }
                
            }
            private static  void ShowMesage(string str)
            {
                Console.WriteLine(str);
            }
    View Code

    执行结果:

    把代码改成不用委托,好像也没啥区别,不太明白。好像没有通知到主线程,只是调用了类的一个方法(ShowMessage)而已。

    这些代码好像没有啥意义。

    static void Main(string[] args)
            {
                //Entrust callback = new Entrust(ShowMesage); //把方法赋值给委托
                //Thread th = new Thread(p=> SendResult(callback,"xxx","abc"));
                //th.IsBackground = true;
                //th.Start(callback);//将委托传递到子线程中
                //th.Start();
    
                Thread t = new Thread(p => SendResult(null, "xxx", "abc"));
                t.Start();
    
                Console.WriteLine("我是主程序里输出的"+Thread.CurrentThread.ManagedThreadId);
    
                
                Console.ReadKey();
            }
    
            private static void SendResult(object obj, string str, string strResult)
            {
                try
                {
                    //注意:线程的参数是object类型
                    for (int i = 1; i <= 10; i++)
                    {
                        Console.WriteLine(Thread.CurrentThread.ManagedThreadId+"子线程循环操作第 {0} 次", i);
                      
                        Thread.Sleep(500);
                    }
                    throw new Exception("子线程报错了");
                    
                }
                catch (Exception ex)
                {
                    ShowMesage(ex.Message);
                    //Entrust callback = obj as Entrust;//强转为委托
                    //callback("我是子线程,我执行完毕了,通知主线程:" + ex.Message);
                    
                }
                
            }
            private static  void ShowMesage(string str)
            {
                Console.WriteLine("当前进程ID:"+Thread.CurrentThread.ManagedThreadId+ str);
            }
    View Code
  • 相关阅读:
    虚拟化VMware之虚拟机备份(1)
    虚拟化VMware之虚拟机备份(1)
    柯塔娜大合唱,互联网安全观
    柯塔娜大合唱,互联网安全观
    如何在虚拟机上Centos系统安装Nginx服务
    给已验证登录的用户添加访问限制
    Python爬虫入门教程 23-100 石家庄链家租房数据抓取
    login_required装饰器(1)
    Oracle 18c 新特性:动态 Container Map 增强 Application Container 灵活性
    如果登录不成功,跳转到登录页面
  • 原文地址:https://www.cnblogs.com/sportdog/p/9635686.html
Copyright © 2011-2022 走看看