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. Codeforces Round #345 (Div. 2) A. Joysticks dp

    A. Joysticks 题目连接: http://www.codeforces.com/contest/651/problem/A Description Friends are going to ...

  2. 探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用23

    前言 首先说明这并不是一个教程贴,而记事本应用是网上早有的案例,对于学习 vuex 非常有帮助.我的目的是探索 vuex 2.0 ,然后使用 vuejs 2.0 + vuex 2.0 重写这个应用,其 ...

  3. Linux 下的图形库介绍

    在进行Linux下的图形系统编程时,我们常常会遇到以下这些概念: Framebuffer, X11, SDL,DFB, miniGUI, OpenGL,QT, GTK,KDE, GNOME等等. 一. ...

  4. mac设置多个屏幕显示的问题

    点击 设置 -> 显示器 -> 排列,然后拉着菜单在两个显示器之间切换.

  5. RMAN备份与恢复之概念一

    1.  数据库完全备份: 按归档模式分为归档和非归档 归档模式 打开状态,属于非一致性备份 关闭状态,可以分为一致性和非一致性 非归档模式 打开状态,非一致性备份无效 关闭状态,一致性备份,非一致性备 ...

  6. Win8安装程序出现2502、2503错误解决方法

    我是在安装VMware virtualbox的时候遇到的这个问题,上网百度了一下发现这是个在win8系统上安装程序时才会遇到的. 究其原因这个问题还是由于权限问题导致的,解决方法如下: 1,ctrl+ ...

  7. Indirect Buffers

    间接cmd 用在 gpu建立的cmd 不需要cpu参与 用indirect cpu gpu就不会互相等待了 直接gpu建立了 gpu用 之前的cmd是cpu建立 填入数据 gpu拿来执行的 在meta ...

  8. solr 自聚类实现

    参考官网:https://lucene.apache.org/solr/guide/6_6/result-clustering.html 最近用到solr自聚类的,先简单介绍如下: 1.配置文件 主要 ...

  9. Windows Vista如何让梦幻桌面支持更多格式

    Windows Vista 梦幻桌面(DreamScene)到底能不能支持除了Mpeg/mpg以外的格式? 很多人说梦幻桌面的视频格式有限,像AVI.RM.RMVB就不能做成梦幻桌面!也有很多朋友着急 ...

  10. VS 一键调用 SVN Blame

    在Windows上做项目开发的时候,常常需要调用SVN Blame去追溯一个文件的编辑历史,但是这个常见的需求往往需要很繁琐的步骤.首先需要打开文件所在文件夹,然后右键,在一长排上下文菜单中准确地选中 ...