【文件属性】:
文件名称:委托和方法的异步调用-python3+opencv3识别图片中的物体并截取的方法
文件大小:10.59MB
文件格式:PDF
更新时间:2021-07-10 13:22:18
.net之美 关键技术解析
3.7 委托和方法的异步调用
在通常情况下,如果需要异步执行一个耗时的操作,我们会新建一个线程,然后让这个
线程去执行代码。但是对于每一个异步调用都通过创建线程来进行操作显然会对性能产生一
定的影响,同时操作也相对繁琐一些。在.NET中可以通过委托进行方法的异步调用,就是说
客户端在异步调用方法时,本身并不会因为方法的调用而中断,而是从线程池中抓取一个线
程去执行该方法,自身线程(主线程)在完成抓取线程这一过程之后,继续执行下面的代
码,这样就实现了代码的并行执行。使用线程池的好处就是避免了频繁进行异步调用时创
建、销毁线程的开销。
如同上面所介绍的,当在委托对象上调用BeginInvoke()时,便进行了一个异步的方法
调用。上面的例子是在事件的发布和订阅这一过程中使用了异步调用,而事件发布者和订阅
者之间往往是松耦合的,发布者通常不需要获得订阅者方法执行的情况;而当使用异步调用
时,在更多情况下是为了提升系统的性能,而并非专用于事件的发布和订阅这一编程模型。
而在这种情况下使用异步编程时,就需要进行更多的控制,比如当异步执行方法的方法结束
时通知客户端、返回异步执行方法的返回值等。本节就对BeginInvoke()方法、EndInvoke()
方法和其相关的IAsyncResult做一个简单的介绍。
说明
注意此处笔者已经不再使用发布者、订阅者这些术语,因为此处讨论的不再是上面的事
件模型,而是在客户端程序中异步地调用方法,这里有一个思维的转变。
来看这样一段代码,它演示了不使用异步调用的通常情况:
class Program7 {
static void Main(string[] args) {
Console.WriteLine("Client application started!\n");
Thread.CurrentThread.Name = "Main Thread";
Calculator cal = new Calculator();
int result = cal.Add(2, 5);
Console.WriteLine("Result: {0}\n", result);