委托中的invoke和begininvoke

来源:互联网 发布:erp软件的作用 编辑:程序博客网 时间:2024/04/27 23:10

C#中委托的invoke 和begininvoke是不一样的,beginInveok会开启另一个线程,所以是异步,而invoke是不会开启线程的,是同步。如果有返回值,可以使用EndInvoke来获取,使用EndInvok将会阻塞程序。

class Program

    {
        delegate void test();
        static void Main(string[] args)
        {
            test ts = new test(TestDelegate);
            ts.BeginInvoke(null,null);             //使用到委托的beginInvoke方法
            Console.WriteLine("hello");
        }

        internal static void TestDelegate()
        {
            Thread.Sleep(5000);
        }

    }

上面程序代码中使用到begininvoke方法,此时控制台会立刻输出hello字符,然后结束主程序运行。由此可知beginInvoke是在主线程之外,另起了一个线程来运行其所需的代码。

再看下面这点程序

    class Program
    {
        delegate void test();
        static void Main(string[] args)
        {
            test ts = new test(TestDelegate);
            ts.Invoke();     //使用到委托的invoke方法
            Console.WriteLine("hello");
        }

        internal static void TestDelegate()
        {
            Thread.Sleep(5000);
        }

    }

唯一区别就是使用到了 invoke方法,此时控制台会等待5秒,然后才输出hello字符。由此可知invoke是使用主线程运行其代码的,并没有另起线程。


如果有返回值,可以使用EndInvoke来获取,使用EndInvok将会阻塞程序。

例如:

NewTaskDelegate task=newTask;

IAsyncResult asyncResult=task.beginInvoke(2000,null,null);

int result=task.EndInvoke(asyncResult);

console.wrinteLine(result);


如果使用Endinvoke会阻塞程序,所以可以采用另外的一种机制,调用回调函数;

代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Remoting.Messaging;using System.Text;using System.Threading.Tasks; namespace TestDelegate{    class Program    {        public static AddDelegate addDelegate;         static void Main(string[] args)        {            addDelegate = add;            addDelegate.BeginInvoke(3, 4, new AsyncCallback(回调函数), "AsycState:OK");            Console.ReadKey();        }         static private int add(int a, int b)        {            return a + b;        }         //AsyncResult 是IAsyncResult接口的一个实现类,空间:System.Runtime.Remoting.Messaging                    //AsyncDelegate 属性可以强制转换为用户定义的委托的实际类。         static void 回调函数(IAsyncResult result)        {            AddDelegate addTest = (AddDelegate)((AsyncResult)result).AsyncDelegate;                    Console.WriteLine(addTest.EndInvoke(result));            Console.WriteLine(result.AsyncState);        }     }     public delegate int AddDelegate(int a, int b);}
这样的话就不会阻塞主线程了,当新开辟的线程执行完毕后就会自动调用回调函数。

1 0
原创粉丝点击