.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(500);
            }

            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(2000);

            //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;
        }
    }

}
时间: 2024-11-08 07:49:45

.net 非阻塞事件获取返回异步回调结果的相关文章

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

阻塞.非阻塞.同步.异步IO http://www.cnblogs.com/yunxitalk/p/9031306.html 介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以及使用方式. Unix网络编程一书中作者给出了五种IO模型: 1.BlockingIO - 阻塞IO 2.NoneBlockingIO - 非阻塞IO 3.IO multip

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

原文:一文读懂阻塞.非阻塞.同步.异步IO 介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以及使用方式.Unix网络编程一书中作者给出了五种IO模型:1.BlockingIO - 阻塞IO2.NoneBlockingIO - 非阻塞IO3.IO multiplexing - IO多路复用4.signal driven IO - 信号驱动IO5.a

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

socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对

关于:socket阻塞、非阻塞,同步、异步、I/O模型

今天偶然被学弟问这个问题,自己说的模模糊糊的,还是再次总结一下! 一般提起I/O模型的时候,这几个概念总是有点让人模糊,其实如果理解了,还是比较好区分的. Ps:参考<UNIX网络编程:卷一> 1."同步"和"异步" 如果单单理解这两个概念还是很好区分的: 同步:处理事情的的时候需要串行执行,也就是说做完一件再去做另一件,不管是否需要时间等待.也就是说,无条件等待这件事被完成. 异步:处理事情的的时候可以并发,即可以同时做几件事,不需要一件事做完再做另一

网络IO之阻塞、非阻塞、同步、异步总结

1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解.网上有详细的分析:http://blog.csdn.net/historyasamirror/article/details/5778378.我结合网上博客和书总结一下,加以区别,加深理解. 2.数据流向 网络IO操作实际过程涉及到内核和调用这个IO操作的进程.以read为例,read的具体操作分为以下两个

阻塞和非阻塞,同步和异步

阻塞和非阻塞,同步和异步 1 例子 故事:老王烧开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响的水壶,简称响水壶). 老王想了想,有好几种等待方式 1.老王用水壶煮水,并且站在那里,不管水开没开,每隔一定时间看看水开了没.-同步阻塞 老王想了想,这种方法不够聪明. 2.老王还是用水壶煮水,不再傻傻的站在那里看水开,跑去寝室上网,但是还是会每隔一段时间过来看看水开了没有,水没有开就走人.-同步非阻塞 老王想了想,现在的方法聪明了些,但是还是不够好. 3.老王这次使用高大上的响水壶来煮水

IO模型--阻塞IO,非阻塞IO,IO多路复用,异步IO

IO模型介绍: * blocking IO 阻塞IO * nonblocking IO 非阻塞IO * IO multiplexing IO多路复用 * signal driven IO 信号驱动IO () * asynchronous IO 异步IO IO模型介绍: 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,

协程,事件,队列,同步,异步,回调函数

协程 什么是协成?单个线程并发的处理多个任务,程序控制协成的切换+保持状态,协成的切换速度非常快,蒙蔽了操作系统的眼睛,让操作系统认为CPU一直在运行 进程或线程都是由操作系统控制CPU来回切换,遇到阻塞就切换执行其他任务,协成是程序控制的,霸占CPU执行任务,会在操作系统控制CPU之前来回切换,操作系统就认为CPU一直在运作 协程的优点: 1.开销小 2.运行速度快 3.协程会长期霸占CPU只执行我程序里的所有任务 协程的缺点: 1.协程属于微并发,处理任务不易过多 2.协程的本质是单线程,无

socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较

1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个异步过程调用发出后,调