C#子线程执行完后通知主线程

原创 2016年06月01日 10:40:18

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

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

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);
        }
    }

上面就是一个通过委托进行向主线程传值(也就是通知主线程)的过程,上面我们是自己定义了一个委托,当然我们也可以使用.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); };

下面是运行结果
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

c#子线程执行完怎么通知主线程

c#子线程执行完怎么通知主线程 定义一个委托实现回调函数 public delegate void CallBackDelegate(string message); 程序开始的时候 //把回调的...

C#process判断线程是否执行完毕

如下使用: Process   proc   =   new   Process(); proc.StartInfo.FileName   =   "cmd "; proc.Start()...
  • foart
  • foart
  • 2011年09月25日 17:24
  • 6001

c#子线程执行完怎么通知主线程

程序了开 了4个子线程.各自独立.子线程根据输入信号判断while循环,符合条件退出while循环,该子线程就算运行结束了,可是主线程怎么知道他执行完了呢? 难道用一个时间触发器,多少时间检测一下各...

异步回调 主线程等待子线程结束

static TimeSpan waitTime = new TimeSpan(0, 0, 5);         static WaitHandle[] waitHandles = new Wai...

多线程中主线程等待所有子线程执行完再继续执行的解决方法

最近在做系统架构的时候,一个命令需要同时在多个分布节点上执行命令,但主处理又必须等所有节点执行回来后再继续处理,因此研究了一下多线程,现分享如下: 1)第1种方法,微软提供的标准教程: 利用 Ma...

并发问题和主线程等待所有子线程运行完毕再执行

我们对数据库的操作是一个耗时过程,假如我们需要让数据库批量操作完成之后,再跳转到另外一个页面,注意:是批量操作完成之后再跳转。 分析:以上需求我们遇到2个难点, 第一个难点是怎么控制并发问题, ...

c#子线程执行完怎么通知主线程

定义一个委托实现回调函数 public delegate void CallBackDelegate(string message); 程序开始的时候 //把回调的方法给委托变量 CallBackD...

C# 委托 回调 操作UI主线程 学习笔记

本篇相当于是对前面两篇博的一个简单总结,相当于为c#开发桌面程序有了一个多线程的应用方案。涉及了委托传参,回调委托,跨线程等。下面先直接上代码: 这段代码实现了,点Start按钮,开始更新进度条,当...

在C#中主线程和子线程如何实现互相传递数据

在C#中主线程和子线程如何实现互相传递数据    转载于:老帅                                    在C#中创建线程Thread时,可以有多种方法,...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#子线程执行完后通知主线程
举报原因:
原因补充:

(最多只允许输入30个字)