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不一致,表现是异步的。

posted @ 2016-07-26 12:56  bky_xiaozhu  阅读(286)  评论(0编辑  收藏  举报