委托中的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);}这样的话就不会阻塞主线程了,当新开辟的线程执行完毕后就会自动调用回调函数。
- 委托中的invoke和begininvoke
- C#中的invoke和begininvoke
- C#中的invoke和begininvoke
- C# 中的invoke和begininvoke
- 委托的Invoke 和 BeginInvoke 与Control的Invoke和BeginInvoke
- 委托的Invoke 和 BeginInvoke 与Control的Invoke和BeginInvoke
- 委托的invoke、beginInvoke和控件的invoke、beginInvoke的区别
- C#中的Invoke和BeginInvoke方法详解
- C#中的线程BeginInvoke和Invoke
- C# 中的Invoke和BeginInvoke机制
- 关于委托、事件、Invoke和BeginInvoke 的理解
- control中的invoke、begininvoke
- Invoke和BeginInvoke
- BeginInvoke和Invoke
- Invoke和BeginInvoke 区别
- Invoke和BeginInvoke
- Invoke 和 BeginInvoke
- Invoke和BeginInvoke
- 矩阵求导公式
- 回调方法举例
- tensorflow学习笔记三:实例数据下载与读取
- 发布客户化PLSQL APIs到Oracle Integration Repositoy(IREP)
- 一些常用的正则
- 委托中的invoke和begininvoke
- DOCKER windows安装
- Javascript 严格模式use strict详解
- Django-Rest-Framework 入门
- 论文笔记 FCN: Fully Convolutional Networks for Semantic Segmentation
- 9 接口描述语言 slice
- IDEA运行web工程报错,Error running wis-client-web: SSL HTTP Connector node not found: set up one in the ser
- javascript Thunk深入解析
- 构建安全的Ajax WCF服务