.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但是我通过某种手段, ...
随机推荐
- [转]Spring MVC 事务配置
Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法: <tx:advice/>就是告诉事务管理器:怎么做 ...
- 基于 Dapper 的一个 DbUtils
/// <summary> /// v1.0 /// </summary> public partial class DbUtils { string ConnectionSt ...
- 使用webclient上传下载实例
转载:http://blog.csdn.net/kevonz/article/details/5078432 using System; using System.Collections.Generi ...
- JavaScript 开发的45个技巧2
http://mp.weixin.qq.com/s?src=3×tamp=1474692926&ver=1&signature=agI3W5rKmVC6GgbdTXh ...
- errno错误码及含义(中文)
/usr/include/asm/errno.h #define EPERM 1 /* Operation not permitted */操作不允许 #define ENOENT 2 /* No s ...
- IOS Reachability判断所请求服务器是否超时?
开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息.如果没有处理它们,是不会通过Apple的审查的. Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法. ...
- 实现自动解析properties文件并装配到Bean
主要实现了,配置的属性就装配, 没有配置的属性不装配 思路: 1 . 通过反射获取类内部所有方法名称 2 . 获取perperties 的key集合 3 . 处理字符串,比较两个匹配,如果匹配成功就 ...
- jQuery.extend重载合并
使用: var people1 = { apple: 0, banana: { weight: 52, price: 100 }, age: 97 }; var people2 = { banana: ...
- cas协议,以及tomcat搭建cas服务器
1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...
- jquery接收后台数组或集合回显复选框
公司使用的框架比较旧,没有使用el等表达式.如果后台传递的是数组,需要把数组转为以逗号分隔的字符串. <% String context = request.getContextPath(); ...