C#异步调用示例详解
程序员文章站
2023-12-09 23:55:09
本文实例为大家分享了c#异步调用的具体代码,供大家参考,具体内容如下
using system;
using system.collections.gene...
本文实例为大家分享了c#异步调用的具体代码,供大家参考,具体内容如下
using system; using system.collections.generic; using system.text; using system.runtime.interopservices; using system.threading.tasks; namespace asyncapptest { ////异步调用示例详解 /// 第1步:定义委托;此委托的返回值、参数类型必须与要调用的异步方法一致; /// public delegate task<string> asyncsendmail(string rece, string copyer, string subj, string body); class delegatetest { //定义委托变量 asyncsendmail sendmail = null; //异步方法的回调方法 //回调方法必须要有类型为 iasyncresult的参数, //以获取开始异步 begininvoke的调用结果 void backcall(iasyncresult parameter) { //parameter.iscompleted用于判断异步方法是否已调用完成; if(parameter.iscompleted) { //通过endinvoke方法获取异步方法的返回结果(类型与异步方法的结果一致) task<string> message = sendmail.endinvoke(parameter); console.write(string.format("回调完成,返回值:{0}", message.result)); } else { console.write("调用未完成"); } } public string asyncsendmailhandler( string rece, string copyer, string sub, string body) { //wcftest.mailserviceclient 是服务器上的wcf服务,是本示例内要调用的异步方法 wcftest.mailserviceclient sc = new wcftest.mailserviceclient(); //将异步方法与委托关联 sendmail = new asyncsendmail(sc.sendemailasync); string s = null; //以下begininvoke方法在调用时,先将 sendemailasync的参数传入,backcall是回调方法,s在此处的作用未弄明白, //但参数中不可省略 // 异步是相对于委托实例所在线程的,本示例中是指sendmail与sc.mailserviceclient不是一个线程; sendmail.begininvoke(rece, copyer, sub, body, backcall, s); return s; } } class program { static void main(string[] args) { delegatetest test = new delegatetest(); test.eventcompletehandle("gqpeng@cmhit.com", null, "测试邮件", "测试邮件"); console.write("上面是异步开始调用"); console.read(); } } }
另:以下是invoke与begininvoke的区别。
control.invoke 方法 (delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托。
control.begininvoke 方法 (delegate) :在创建控件的基础句柄所在线程上异步执行指定委托。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。