.net 非阻塞事件获取返回异步回调结果
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace AsyncCallBack_Delegate
{
class Program
{
static void Main(string[] args)
{
JobManager manager = new JobManager();
ReadJob read = manager.Run<ReadJob>();
read.Started += new EventHandler(read_Started);
read.Completed += new EventHandler<CompletedEventArgs>(read_Completed);
read.OnUnhandledException += new EventHandler<ExceptionEventArgs>(read_OnUnhandledException);
read.Execute(); while (!read.IsCompleted)
{
Console.WriteLine("Main thread[" + Thread.CurrentThread.ManagedThreadId + "] is waiting to close...");
Thread.Sleep();
} Console.WriteLine("ReadJob is completed and return value: " + read.RetVal); Console.WriteLine("Jobs have been finished, press any key to continue...");
Console.ReadKey(); } static void read_OnUnhandledException(object sender, ExceptionEventArgs e)
{
Console.WriteLine("Exception:" + sender.GetType().FullName + " Exception message:" + e.Message);
} static void read_Completed(object sender, CompletedEventArgs e)
{
Console.WriteLine("Completed:" + sender.GetType().FullName + " Process executed result:" + e.Success);
} static void read_Started(object sender, EventArgs e)
{
Console.WriteLine("Started:" + sender.GetType().FullName);
}
} public class JobManager
{
public T Run<T>() where T : IJobService, new()
{
return new T();
}
} public interface IJobService
{
void Execute();
event EventHandler<CompletedEventArgs> Completed;
event EventHandler Started;
event EventHandler<ExceptionEventArgs> OnUnhandledException; } delegate void ProcessDelegate(string message); public class ReadJob : IJobService
{
//定义供ReadJob实例对象对外注册的事件
public event EventHandler Started;
public event EventHandler<CompletedEventArgs> Completed;
public event EventHandler<ExceptionEventArgs> OnUnhandledException; object lockObj = new object(); event EventHandler<CompletedEventArgs> IJobService.Completed
{
add
{
lock (lockObj)
{
Completed += value;
}
}
remove
{
lock (lockObj)
{
Completed -= value;
}
}
}
event EventHandler IJobService.Started
{
add
{
lock (lockObj)
{
Started += value;
}
}
remove
{
lock (lockObj)
{
Started -= value;
}
}
}
event EventHandler<ExceptionEventArgs> IJobService.OnUnhandledException
{
add
{
lock (lockObj)
{
OnUnhandledException += value;
}
}
remove
{
lock (lockObj)
{
OnUnhandledException -= value;
}
}
} public bool IsCompleted { get; set; }
public bool RetVal { get; set; } public void Execute()
{
IsCompleted = false;
RetVal = false; EventHandler eventHandler = Started;
if (null != eventHandler)
{
eventHandler(this, new EventArgs());
} //异步回调方式调用Process方法
//返回值和Completed事件在回调方法中调用
ProcessDelegate process = Process;
process.BeginInvoke("ReadJob", CompletedMethod, process); } public void Process(String message)
{
Console.WriteLine("Process thread[" + Thread.CurrentThread.ManagedThreadId + "]:" + message + " JobService:" + this.GetType().FullName);
Thread.Sleep(); //test
//throw new Exception("test exception"); } //异步回调执行完毕后调用的方法
public void CompletedMethod(IAsyncResult result)
{
//获取返回值
try
{
(result.AsyncState as ProcessDelegate).EndInvoke(result);
RetVal = true; //线程同步 使用临时变量代替eventhandler,委托是不可变的immutable
//也可以使用 Interlocked.CompareExchange(ref eventhandler,null,null)
EventHandler<CompletedEventArgs> eventHandler = Completed;
if (null != eventHandler)
{
eventHandler(this, new CompletedEventArgs(true));
}
}
catch (Exception ex)
{
//异常处理的事件再次执行,线程同步 使用临时变量代替eventhandler,委托是不可变的immutable
//也可以使用 Interlocked.CompareExchange(ref eventhandler,null,null)
EventHandler<ExceptionEventArgs> eh = OnUnhandledException;
if (null != eh)
{
eh(this, new ExceptionEventArgs(ex.Message));
}
RetVal = false;
}
//执行Completed事件注册的方法,此处使用eventHandler临时变量避免在判断是否为null时事件被移除
//若多线程需要使用
IsCompleted = true;
} } public class CompletedEventArgs : EventArgs
{
public bool Success { get; set; }
public CompletedEventArgs(bool success)
{
this.Success = success;
}
} public class ExceptionEventArgs : EventArgs
{
public string Message { get; set; }
public ExceptionEventArgs(string message)
{
this.Message = message;
}
} }
.net 非阻塞事件获取返回异步回调结果的更多相关文章
- 一文读懂阻塞、非阻塞、同步、异步IO
介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以 ...
- 阻塞、非阻塞、同步、异步IO
阻塞.非阻塞.同步.异步IO http://www.cnblogs.com/yunxitalk/p/9031306.html 介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用. ...
- python学习笔记-(十四)I/O多路复用 阻塞、非阻塞、同步、异步
1. 概念说明 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可 ...
- socket阻塞与非阻塞,同步与异步
socket阻塞与非阻塞,同步与异步 作者:huangguisu 转自:http://blog.csdn.net/hguisu/article/details/7453390 1. 概念理解 在进行网 ...
- socket阻塞与非阻塞,同步与异步、I/O模型
socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步: 所 ...
- 【python】-- 事件驱动介绍、阻塞IO, 非阻塞IO, 同步IO,异步IO介绍
事件驱动介绍 一.前言 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收 ...
- Python学习-day10(番外篇) 阻塞IO 非阻塞IO 同步IO 异步IO
这个章节的内容是关于IO的概念,谈一谈什么是 阻塞IO 非阻塞IO 同步IO 异步IO.以下摘要是我对这四种IO的一个形象理解. 场景是去去银行办理业务.节点有三个,1)到银行提交申请:2)取号:3) ...
- socket阻塞与非阻塞,同步与异步I/O模型
作者:huangguisu 原文出处:http://blog.csdn.NET/hguisu/article/details/7453390 socket阻塞与非阻塞,同步与异步 1. 概念理解 在进 ...
- day37——阻塞、非阻塞、同步、异步
day37 阻塞.非阻塞.同步.异步 进程运行的三个状态:运行.就绪.阻塞 执行的角度 阻塞:程序运行时,遇到了IO,程序挂起,CPU被切走 非阻塞:程序没有遇到IO,程序遇到IO但是我通过某种手段, ...
随机推荐
- PHP 自定义字符串中的变量名解析
PHP 自定义字符串中的变量名解析 这样一个需求:页面的 title 可以在后台自定义,自定义内容中可能包含变量,变量用 {$var} 表示, 其中 $var 为变量名 将 title 字段存入数 ...
- CF 256C Furlo and Rublo and Game【博弈论,SG函数】
暴力的求SG函数会超时,正解是先处理出10^6以内的SG值,对于更大的,开根号之后计算出. 小数据观察可以发现sg函数值成段出现,而且增长速度很快,因此可以计算出来每一段的范围,只需打表即可. Nim ...
- Inno Setup入门(十九)——Inno Setup类参考(5)
单选按钮 单选按钮在安装中也很常见,例如同一个程序可以选择安装不同的性质的功能,例如选择32位或者64位等,两者是排他性的,因此可以通过单选按钮(RadioButton)来实现,在同一个容器中放置的单 ...
- pcap报文格式
pcap报文格式 pcap报文整体格式 pcap 报文头格式 pcap报文格式,黄色部分为报文头 pcapng报文格式 PCAPNG: PCAP Next Generation Dump File F ...
- 5 Best Gantt Chart JIRA Plugins
Andrew Stepanov/June 23, 2017/6 minutes Software developers enjoy using JIRA software for their proj ...
- UINavigationController 详解
// 导航控制器 // 1. 比较常用的视图控制器管理类 // 2. 以栈的形式管理视图控制器, 先进后出 // 3. 创建navigation后, 视图控制器上会多出一个导航栏 // 4. 导航栏高 ...
- iOS:导航控制器侧滑出栈实现
介绍:在iOS中,导航控制器UINavigationController是默认实现左侧边缘侧滑手势出栈的,但是如果当开发者对导航控制器子控制实现自定义leftBaButtonItem时,这个侧滑功能就 ...
- 在linux中实现多网卡的绑定 介绍常见的7种Bond模式
网卡bond是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡.在应用部署中是一种常用的技术,我们公司基本所有的项目相关服务器都做了bond,这里总结整理,以便待查. bond ...
- Tile based Rendering //后面一段是手机优化建议
https://www.imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/ 一种硬件结构 ...
- java map 分析
java 8 对HashMap进行了优化, 当碰撞时使用TreeNode的二分方法查找数据: 但是当数据碰撞厉害的时候, table有很多浪费. table 大小等于size/factor, 当碰撞很 ...