今天,边肖将与你分享一篇关于C#使用delegate BeginInvoke作为异步线程的文章。边肖觉得内容挺好的,现在分享给大家,很有参考价值。有需要的朋友一起看看吧。
在一个应用场景中,浏览器上传一个文件,这个文件在后台调用文件转换,需要相当长的时间。这样,如果一个线程同步进行,用户会觉得卡在浏览器里,咔咔咔咔。这里我们使用委托的BeginInvoke和EndInvoke方法来操作线程,BeginInvoke方法可以使用线程异步执行委托所指向的方法。然后通过EndInvoke方法获取方法的返回值(EndInvoke方法的返回值就是被调用方法的返回值),或者确定方法已经被成功调用。说白了,相当于启动了一个多线程。保存用户文件后,响应返回,BeginInvoke异步执行委托方法。之后,执行异步回调函数。
大概步骤
1:先拉出你要异步执行的方法;
2:定义异步方法的委托;
3:在调用位置实例化这个委托;
4:调用此委托实例的BeginInvoke方法。在这个方法中,前面填充委托的参数,后面是委托方法结束后的回调函数;
5:写委托的回调函数。回调函数是一个固定参数(IAsyncResultIR)。在此,您可以获取用户定义的对象,该对象限制或包含有关异步操作(AsyncState)的信息,然后调用EndInvoke以获取委托方法结束的返回值。
6:调用自定义回调函数;
让我们看看代码:
公共类anysFileChange
{
///摘要
///文件变更后,其对应的业务逻辑所需的变更锁调用的委托。
///转换后,将调用执行的函数。用户需要做什么,这个功能会由用户自己的逻辑来完成。
////摘要
public static any schanginghandlercallback _ handler=null;
///摘要
///转换文件
////摘要
///param name='filepath '文件路径/param
///返回/返回
公共静态void changing file(string file path,string attachId)
{
//打开异步转换
DEGAsyncChangingFile ACF=new DEGAsyncChangingFile(anysFileChange。AsyncChangeFileToswf);
acf。BeginInvoke(filepath,attachId,anysFileChange。CallBackAsync,ACF);
}
///摘要
///异步函数执行后的回调函数。
////摘要
///param name='IR '异步结果/param
///返回/返回
私有静态void callback async(IAsyncResult IR)
{
degasynchangingfile ACF=(degasynchangingfile)IR。异步状态;
ResultObj结果=(ResultObj)acf。end invoke(IR);
//如果调用文件转换结束方法有需要在转换结束时完成的已定义委托,则执行用户定义的委托函数。
if (_handler!=空结果!=空)
{
///成功后才执行自定义回调函数。
if(result . changestaus==EnumChangeStatus。成功)
{
_handler(result.filepath,result . attachid);
}
}
}
///摘要
///转换文件
////摘要
///param name='filepath '文件路径/param
///returnshsuvresultobj返回结果对象/returns
私有静态result obj AsyncChangeFileToswf(string file path,string attachId)
{
result obj RES=new result obj();
//转换动作
convert file cf=new convert file();
//cf这个类提供一个日志事件来注册一个日志事件。
cf.ConvertLog=new ConvertFile。ConvertLogHandler(系统日志);
//这里cf这个类提供的方法,用里面的转换方法就可以了。
参见Convert(file path);
if(参见ChangeResult==EnumChangeStatus。成功)
{
RES . attach id=attach id;
RES . file path=file path;
RES . changestaus=cf . change result;
}
其他
{
RES . change消息=cf . convert消息;
RES . changestaus=cf .变更结果;
}
返回表示留数
}
///摘要
///供注册的日志事件
////摘要
///param name='messages'/param
私有静态空的系统日志(字符串消息)
{
"字符串分隔线=' \ r \ n========================================================================\ r \ n ";
字符串日志=字符串。格式(@'{0} {1} {2} {0} ',分隔行,日期时间现在。ToString(),messages);
//如果上传课程文件夹不存在,则创建
如果(!目录。存在(ConverConst.toolpath 'Log\ '))
目录。创建目录(converconst。刀具路径' Log \ ');
StreamWriter SW=new StreamWriter(converconst。刀具路径“日志”日期时间.现在。ToString('yyyy-MM-dd ')' .'文本',真);
西南WriteLine(日志);
西南. close();
}
///摘要
///文件转换委托
////摘要
///param name='filepath '文件路径/param
///返回/返回
私有委托对象DEGAsyncChangingFile(字符串文件路径,字符串附件id);
}
///摘要
///结果集对象
////摘要
公共类结果对象
{
///摘要
///文件路径
////摘要
公共字符串文件路径;
///摘要
///id
////摘要
公共字符串attachId
///摘要
///转换结果消息
////摘要
公共字符串更改消息
///摘要
///转换状态
////摘要
公共EnumChangeStatus更改状态
}
///摘要
///文件转换后,业务逻辑所需要调用的委托
////摘要
///param name='filepath '文件路径/param
公共委托void任何schanginghandlercallback(字符串文件路径,字符串att chid);
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。