多线程 异步 beginInvoke EndInvoke 使用
有许多耗时操作时,还要响应用户操作。这时候就需要用其他线程或者异步来搞。本来是改造公司的日志组件。因为多上了个国外大区的业务到来本系统来。这个系统其他地方都好就是日志,动不动就要死给我们看。有时候寻找业务流程时缺失了一块日志,令人欲仙欲死。刚好年末了没什么业务上线,决定改造日志。前人栽树后人心凉。本着我不入地狱谁入地狱的精神,折腾完了这个日志。发现线程的有些地方处理的不好。顺带给自己留个念想谢谢异步或者多线程的东西。有错误欢迎指正。
beginInvoke EndInvoke 使用
1. 使用历史
这两个是以前好早就有的,在.net框架内用的比较广泛,比如引用webservice时,除了自动生成同步的方法,还会生成异步调用的方法。
随着.net版本的不同有直接封装成 beginXXXX 和endXXXX的,使用时直接begin,然后处理一些事情,然后再end.不过有个缺点就是固定的方法太死。
后来webservice就封装了下,弄个complete后缀的委托,来事件通知调用结束了。然后调用方法直接是AsycXXXX。跟自己写控件时往上层抛事件差不多。
还有就是IO和网络编程的一些类实现这个,比如NetworkStream 中的读和写都有同步和异步的方法。
2.使用方式
对于这两个使用方式如果使用,可以直接在一个方法内begin end在他们之间搞些事情。不过这样太死板了。一般是给个委托操作。
看如下代码:
public delegate bool deofdosomething(object param);
public void invoketest()
{
Console.WriteLine("star..");
//耗时操作的传递参数
object dosomeparam = "";
//耗时方法执行结束,回调函数可以得到的参数
object endinvokeparam = "";
deofdosomething de = new deofdosomething(dosomething);
AsyncCallback acb = new AsyncCallback(invokecallback);
IAsyncResult iar = de.BeginInvoke(dosomeparam, acb, endinvokeparam);
if (iar.AsyncWaitHandle.WaitOne())
{
Console.WriteLine("not time out");
}
else
{
Console.WriteLine("time out");
}
} private bool dosomething(object obj)
{
//耗时操作
Thread.Sleep();
//dosomeparam
Console.WriteLine(obj.ToString());
return true;
}
AsyncCallback 是.net框架内一个特殊的委托,在异步调用后如果已经执行完成,可以通过这个委托来通知。当然也可用传入null。代表不根据结果操作什么。
iar.AsyncWaitHandle.WaitOne 这个是begin后的语句句柄,可以用来设定是否等待异步超时。跟autoresetevent一样设置超过超时时间立马返回。怀疑里面就是用的这玩意实现的。
会返回个布尔类型的值,如果没有超时这个值是TRUE,如果超时了这个值是FALSE。
private void invokecallback(IAsyncResult iar)
{
deofdosomething de = (deofdosomething)((AsyncResult)iar).AsyncDelegate;
//endinvokeparam
string targeparam = ((AsyncResult)iar).AsyncState.ToString();
Console.WriteLine(targeparam);
//dosomething 有返回值
bool issuccess = de.EndInvoke(iar);
Console.WriteLine("end");
}
IAsyncResult 是异步操作完成的委托传过来执行的方法。作为一个接口可以直接转成 AsyncResult ,它的AsyncDelegate 是可以获取到引用它的委托。
AsyncState 是个object类型的参数,是从begin传来的参数,因为异步操作可以带来一些额外的信息。 一下是测试结果。有人来闹我,等改天再写吧。预计写threadpool还有task两个。希望能坚持。
多线程 异步 beginInvoke EndInvoke 使用的更多相关文章
- C# 对委托的BeginInvoke,EndInvoke 及Control 的BeginInvoke,EndInvoke 的理解
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 转:C# 对委托的BeginInvoke,EndInvoke 及Control 的BeginInvoke,EndInvoke 的理解
转载自:http://www.cnblogs.com/easyfrog/p/3141269.html using System; using System.Collections.Generic; u ...
- Android 多线程 异步加载
Android 应用中需要显示网络图片时,图片的加载过程较为耗时,因此加载过程使用线程池进行管理, 同时使用本地缓存保存图片(当来回滚动ListView时,调用缓存的图片),这样加载和显示图片较为友好 ...
- C# 实现的多线程异步Socket数据包接收器框架
转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...
- C# 多线程 异步加载 窗体
C# 多线程 异步加载 窗体 分类: C#2014-05-28 16:57 1286人阅读 评论(0) 收藏 举报 异步加载 我们在使用 windowform 编程的时候,我们或许可能会越到,各种在窗 ...
- 【iOS系列】-多图片多线程异步下载
多图片多线程异步下载 开发中非常常用的就是就是图片下载,我们常用的就是SDWebImage,但是作为开发人员,不仅要能会用,还要知道其原理.本文就会介绍多图下载的实现. 本文中的示例Demno地址,下 ...
- 多线程异步编程示例和实践-Thread和ThreadPool
说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和ThreadPool说起: 1. 创建并启 ...
- 多线程异步编程示例和实践-Task
上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...
- Java 多线程异步处理demo
java中实现多线程 1)继承Thread,重写里面的run方法 2)实现runnable接口通过源码发现:第一种方法说是继承Tread然后重写run方法,通过查看run方法的源码,发现run方法里面 ...
随机推荐
- 【探索】利用 canvas 实现数据压缩
前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持
Jexus 是一款运行于 Linux 平台,以支持 ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布,有如下更新: 1,现在大 ...
- python基础
内容概要: 一.python2 or python3 目前大多使用python2.7,随着时间的推移,python3将会成为python爱好者的主流. python2和3区别: 1.PRINT IS ...
- java中易错点(二)
java,exe是java虚拟机 javadoc.exe用来制作java文档 jdb.exe是java的调试器 javaprof,exe是剖析工具 解析一: sleep是线程类(Thread)的方法, ...
- 如何用Java类配置Spring MVC(不通过web.xml和XML方式)
DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...
- Js 数组返回去重后的数据
function removeRepeat(data) { var temp = ""; var mainData = []; for (var i = 0; i < dat ...
- BPM任务管理解决方案分享
一.方案概述任务是企业管理者很多意志的直接体现,对于非常规性事务较多的企业,经常存在各类公司下达的各种任务跟进难.监控难等问题,任务不是完成效果不理解,就是时间超期,甚至很多公司管理层下达的任务都不了 ...
- 洛谷P1547 Out of Hay
题目背景 奶牛爱干草 题目描述 Bessie 计划调查N (2 <= N <= 2,000)个农场的干草情况,它从1号农场出发.农场之间总共有M (1 <= M <= 10,0 ...
- Linux.NET学习手记(8)
上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...
