• C#中Invoke和BeginInvoke的区别


    1、Invoke() 调用时,Invoke会阻止当前主线程的运行,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念。

    2、BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,BeginInvoke不会阻止当前主线程的运行,而是等当前主线程做完事情之后再执行BeginInvoke中的代码内容,表现出“异步”的概念。在想获取 BeginInvoke() 执行完毕后的结果时,调用EndInvoke() 方法来获取。而这两个方法中执行的是一个委托。

    测试代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace InvokeDemo
    {
        class Program
        {
            //代理
            private delegate int Mydelegate(int a, int b);
    
            static void Main(string[] args)
            {
                Console.WriteLine("Invoke开始,时间:" + DateTime.Now);
                Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);
                Mydelegate myd = new Mydelegate(Fun);
                var result = myd.Invoke(1, 2);
                Console.WriteLine("计算结果:" + result);
                Console.WriteLine("Invoke结束,时间:" + DateTime.Now);
    
                Console.WriteLine();
                Console.WriteLine("------分割线------");
                Console.WriteLine();
    
                Console.WriteLine("BeginInvoke开始,时间:" + DateTime.Now);
                Mydelegate mydSync = new Mydelegate(Fun);
                mydSync.BeginInvoke(1, 2, new AsyncCallback(AsyncCallback), mydSync);
                Console.WriteLine("BeginInvoke结束,时间:" + DateTime.Now);
    
                Console.Read();
            }
    
            static int Fun(int a, int b)
            {
                Thread.Sleep(3000);
                Console.WriteLine("方法线程ID:" + Thread.CurrentThread.ManagedThreadId);
                return a + b;
            }
    
            static void AsyncCallback(IAsyncResult asyncResult)
            {
                var del = (Mydelegate)asyncResult.AsyncState;
                var funResult = del.EndInvoke(asyncResult);
                Console.WriteLine("计算结果:" + funResult);
            }
        }
    }

    结果:

    可以看出:

    Invoke方法中线程ID跟主线程ID一致,表现是阻塞的。

    InvokeBegin方法中线程ID跟主线程ID不一致,表现是异步的。

  • 相关阅读:
    C# 杨辉三角 下
    C# 自动走迷宫 下
    算法练习之1数字填充 下
    动态添加控件并获取其值
    两个ListBox的互动
    VS2005常用快捷键
    GridView内嵌DropDownList操作
    GridView格式化短日期
    获得客户端ID
    Access数据库 Update 语句的怪现象
  • 原文地址:https://www.cnblogs.com/zhuyongblogs/p/5707097.html
Copyright © 2020-2023  润新知