有许多耗时操作时,还要响应用户操作。这时候就需要用其他线程或者异步来搞。本来是改造公司的日志组件。因为多上了个国外大区的业务到来本系统来。这个系统其他地方都好就是日志,动不动就要死给我们看。有时候寻找业务流程时缺失了一块日志,令人欲仙欲死。刚好年末了没什么业务上线,决定改造日志。前人栽树后人心凉。本着我不入地狱谁入地狱的精神,折腾完了这个日志。发现线程的有些地方处理的不好。顺带给自己留个念想谢谢异步或者多线程的东西。有错误欢迎指正。

  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 使用的更多相关文章

  1. C# 对委托的BeginInvoke,EndInvoke 及Control 的BeginInvoke,EndInvoke 的理解

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. 转:C# 对委托的BeginInvoke,EndInvoke 及Control 的BeginInvoke,EndInvoke 的理解

    转载自:http://www.cnblogs.com/easyfrog/p/3141269.html using System; using System.Collections.Generic; u ...

  3. Android 多线程 异步加载

    Android 应用中需要显示网络图片时,图片的加载过程较为耗时,因此加载过程使用线程池进行管理, 同时使用本地缓存保存图片(当来回滚动ListView时,调用缓存的图片),这样加载和显示图片较为友好 ...

  4. C# 实现的多线程异步Socket数据包接收器框架

    转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...

  5. C# 多线程 异步加载 窗体

    C# 多线程 异步加载 窗体 分类: C#2014-05-28 16:57 1286人阅读 评论(0) 收藏 举报 异步加载 我们在使用 windowform 编程的时候,我们或许可能会越到,各种在窗 ...

  6. 【iOS系列】-多图片多线程异步下载

    多图片多线程异步下载 开发中非常常用的就是就是图片下载,我们常用的就是SDWebImage,但是作为开发人员,不仅要能会用,还要知道其原理.本文就会介绍多图下载的实现. 本文中的示例Demno地址,下 ...

  7. 多线程异步编程示例和实践-Thread和ThreadPool

    说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和ThreadPool说起: 1. 创建并启 ...

  8. 多线程异步编程示例和实践-Task

    上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...

  9. Java 多线程异步处理demo

    java中实现多线程 1)继承Thread,重写里面的run方法 2)实现runnable接口通过源码发现:第一种方法说是继承Tread然后重写run方法,通过查看run方法的源码,发现run方法里面 ...

随机推荐

  1. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

  2. 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)

    前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...

  3. React的使用与JSX的转换

    前置技能:Chrome浏览器   一.拿糖:React的使用 React v0.14 RC 发布,主要更新项目: 两个包: React 和 React DOM DOM node refs 无状态的功能 ...

  4. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  5. WCF基础

    初入职场,开始接触C#,开始接触WCF,那么从头开始学习吧,边学边补充. SOA Service-Oriented Architecture,面向服务架构,粗粒度.开放式.松耦合的服务结构,将应用程序 ...

  6. 【夯实Mysql基础】MySQL性能优化的21个最佳实践 和 mysql使用索引

    本文地址 分享提纲: 1.为查询缓存优化你的查询 2. EXPLAIN 你的 SELECT 查询 3. 当只要一行数据时使用 LIMIT 1 4. 为搜索字段建索引 5. 在Join表的时候使用相当类 ...

  7. 全网独家MongoDB Certified DBA Associate考试认证视频

    该视频意在让所有学员一次通过考试,避免重复考试而承担的巨额考试费用! 目前MongDB发展迅猛,有赶超mysql,和oracle看齐的苗头.在这个时候MongoDB也适时的推出了官方的认证考试&quo ...

  8. Mysql - 游标/动态sql/事务

    游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...

  9. NYOJ 998

    这道题是欧拉函数的使用,这里简要介绍下欧拉函数. 欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数. 欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pk ...

  10. spring boot1

    spring boot 玩转spring boot--快速开始   开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv ...