博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 委托的同步调用和异步调用
阅读量:6319 次
发布时间:2019-06-22

本文共 2350 字,大约阅读时间需要 7 分钟。

委托的Invoke方法用来进行同步调用。同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。

同步调用的例子:

using System;using System.Threading;public delegate int AddHandler(int a, int b);public class Foo {	static void Main() {		Console.WriteLine("**********SyncInvokeTest**************");		AddHandler handler = new AddHandler(Add);		int result = handler.Invoke(1,2);		Console.WriteLine("Do other work... ... ...");		Console.WriteLine(result);		Console.ReadLine();	}		static int Add(int a, int b) {		Console.WriteLine("Computing "+a+" + "+b+" ...");		Thread.Sleep(3000);		Console.WriteLine("Computing Complete.");		return a+b;	}}

运行结果:

**********SyncInvokeTest**************

Computing 1 + 2 ...

Computing Complete.

Do other work... ... ...

3

 

同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕

的用户体验,这时候异步调用就很有必要了。
异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。
委托的异步调用通过BeginInvoke和EndInvoke来实现。
异步调用:

using System;using System.Threading;public delegate int AddHandler(int a, int b);public class Foo {	static void Main() {		Console.WriteLine("**********AsyncInvokeTest**************");		AddHandler handler = new AddHandler(Add);		IAsyncResult result = handler.BeginInvoke(1,2,null,null);		Console.WriteLine("Do other work... ... ...");		Console.WriteLine(handler.EndInvoke(result));		Console.ReadLine();	}		static int Add(int a, int b) {		Console.WriteLine("Computing "+a+" + "+b+" ...");		Thread.Sleep(3000);		Console.WriteLine("Computing Complete.");		return a+b;	}}

运行结果: **********AsyncInvokeTest**************

Do other work... ... ...
Computing 1 + 2 ...
Computing Complete.
3  

可以看到,主线程并没有等待,而是直接向下运行了。
但是问题依然存在,当主线程运行到EndInvoke时,如果这时调用没有结束(这种情况很可能出现),这时为了等待调用结果,线程依旧会被阻塞。
解决的办法是用回调函数,当调用结束时会自动调用回调函数
回调异步:

public class Foo {	static void Main() {		Console.WriteLine("**********AsyncInvokeTest**************");		AddHandler handler = new AddHandler(Add);		IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(AddComplete),"AsycState:OK");		Console.WriteLine("Do other work... ... ...");		Console.ReadLine();	}		static int Add(int a, int b) {		Console.WriteLine("Computing "+a+" + "+b+" ...");		Thread.Sleep(3000);		Console.WriteLine("Computing Complete.");		return a+b;	}		static void AddComplete(IAsyncResult result) {		AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;		Console.WriteLine(handler.EndInvoke(result));		Console.WriteLine(result.AsyncState);	}}

转载地址:http://zjcaa.baihongyu.com/

你可能感兴趣的文章
Shredding Company 碎纸机,dfs()枚举每一种情况,再加剪枝。
查看>>
命名空间和模块化编程 - C++快速入门39
查看>>
结构化程序设计03 - 零基础入门学习Delphi12
查看>>
D2007在64位Win7出现 delphi 2007 assertion failure thread32.cpp 的解决办法
查看>>
STM32的TAMPER-RTC管脚作为Tamper的使用[转]
查看>>
[记]一个逐步“优化”的范例程序
查看>>
2012-01-09_2
查看>>
数学 - 线性代数导论 - #5 矩阵变换之置换与转置
查看>>
java数据结构:队列
查看>>
使用.NET进行高效率互联网敏捷开发的思考和探索【一、概述】
查看>>
切换默认Activity和Fragment的动画
查看>>
SSM练习——登录实现
查看>>
asp.net core 2.0 Microsoft.Extensions.Logging 文本文件日志扩展
查看>>
余光中_百度百科
查看>>
方法sessionjsp之监听器
查看>>
判断 网络是否通常,以及判断用户使用的网络类型,时2G\3G\还是wifi
查看>>
下一代 Hadoop YARN :相比于MRv1,YARN的优势
查看>>
阿里巴巴离职DBA 35岁总结的职业生涯
查看>>
LOT NUMBER / PO / RECEIPT NO Relation.
查看>>
Fedora9常用网络调试
查看>>