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 非阻塞事件获取返回异步回调结果的更多相关文章

  1. 一文读懂阻塞、非阻塞、同步、异步IO

    介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以 ...

  2. 阻塞、非阻塞、同步、异步IO

    阻塞.非阻塞.同步.异步IO http://www.cnblogs.com/yunxitalk/p/9031306.html 介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用. ...

  3. python学习笔记-(十四)I/O多路复用 阻塞、非阻塞、同步、异步

    1. 概念说明 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可 ...

  4. socket阻塞与非阻塞,同步与异步

    socket阻塞与非阻塞,同步与异步 作者:huangguisu 转自:http://blog.csdn.net/hguisu/article/details/7453390 1. 概念理解 在进行网 ...

  5. socket阻塞与非阻塞,同步与异步、I/O模型

    socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所 ...

  6. 【python】-- 事件驱动介绍、阻塞IO, 非阻塞IO, 同步IO,异步IO介绍

    事件驱动介绍 一.前言 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收 ...

  7. Python学习-day10(番外篇) 阻塞IO 非阻塞IO 同步IO 异步IO

    这个章节的内容是关于IO的概念,谈一谈什么是 阻塞IO 非阻塞IO 同步IO 异步IO.以下摘要是我对这四种IO的一个形象理解. 场景是去去银行办理业务.节点有三个,1)到银行提交申请:2)取号:3) ...

  8. socket阻塞与非阻塞,同步与异步I/O模型

    作者:huangguisu 原文出处:http://blog.csdn.NET/hguisu/article/details/7453390 socket阻塞与非阻塞,同步与异步 1. 概念理解 在进 ...

  9. day37——阻塞、非阻塞、同步、异步

    day37 阻塞.非阻塞.同步.异步 进程运行的三个状态:运行.就绪.阻塞 执行的角度 阻塞:程序运行时,遇到了IO,程序挂起,CPU被切走 非阻塞:程序没有遇到IO,程序遇到IO但是我通过某种手段, ...

随机推荐

  1. NOI 二分算法练习

    1.NOI 二分法求函数的零点 总时间限制:  1000ms 内存限制:  65536kB 描述 有函数: f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * ...

  2. Hiho----拓扑排序

    拓扑排序·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来. 小Ho:小Hi,你这学期有选什么课么? 小H ...

  3. FTP客户端工具

    推荐使用8UFTP.小.快.好! 8UFTP工具分为8UFTP客户端工具和 8UFTP智能扩展服务端工具,涵盖其它FTP工具所有的功能.不占内存,体积小,多线程,支持在线解压缩.界面友好,操作简单,可 ...

  4. subline text 常用插件

    C语言 Alignment   c Improved   cool format doc Blocker   cTags   AllAutoComplete       wakatime 精确统计你再 ...

  5. 在u-boot中添加命令

    转:http://www.embedu.org/Column/Column464.htm 作者:曾宏安,华清远见嵌入式学院讲师. u-boot是嵌入式系统中广泛使用的一种bootloader.它不仅支 ...

  6. Oracle Form删除list项

    Oracle From中的list项点击后就会新增一个下拉列,此时可以使用 Ctrl+shift+< 进行删除

  7. easyui-combobox绑定回车事件注意事项

    回车事件的定义的位置必须是easyui-combobox数据加载的后面,才有效果. HTML文件: <select id="aucBrandNo" class="e ...

  8. ecshop ecmall shopex

    ecshop 是一个B2C商城 适合企业及个人快速构建个性化网上商店.系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序.(如沃购网)  山大路是dedecms ecmall(ECMall ...

  9. 各种语言性能(CPU密集型程序)比较

    都进行Fib数列计算,计算到n=40的计算时间: 注意:开始,我以为上图中的第二列就是代表C++的性能.但是现在发现,完全不正确. 如果你使用同样的抽象和同样的逻辑去实现同样的代码,C和C++的性能几 ...

  10. 【转载】【Todo】电商架构相关技术分析

    看了一篇文章: http://kb.cnblogs.com/page/193670/    淘宝应对"双11"的技术架构分析 没怎么看懂,有时间再看.