,,C#用委托BeginInvoke做异步线程

,,C#用委托BeginInvoke做异步线程

今天,边肖将与你分享一篇关于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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 设计一个简单的C#控制台应用程序,C#控制台程序,C# 创建控制台应用程序
  • 深入解析windows第8版,深入解析C#(第4版)
  • 数组代码,c# 数组操作,C# 数组实例介绍(图文)
  • 学会C#要多久,学会c#要多久,c#学习之30分钟学会XAML
  • 回溯法01背包问题c,回溯法求解01背包问题伪代码,C#使用回溯法解决背包问题实例分析
  • xml文件转义字符,xml转意字符,C# XML中的转义字符操作
  • winform 进度条控件,c# 进度条使用
  • winform 进度条控件,c# 进度条使用,C#使用winform实现进度条效果
  • winform backgroundworker,c# isbackground
  • winform backgroundworker,c# isbackground,C# BackgroundWorker用法详解
  • lua与c#交互,lua c#
  • lua与c#交互,lua c#,ToLua框架下C#与Lua代码的互调操作
  • linq c#,linq原理 c#
  • linq c#,linq原理 c#,c#中LINQ的基本用法实例
  • java decimal保留两位小数,sql中decimal函数保留2位小数,C#中decimal保留2位有效小数的实现方法
  • 留言与评论(共有 条评论)
       
    验证码: