C# 委托事件的异步调用

 1         public class Publish
 2         {
 3             public delegate void PublishEventHandler(object sender,PublishEventArgs e);
 4             private event PublishEventHandler publish;
 5             private Delegate[] del;
 6             public class PublishEventArgs :EventArgs
 7             {
 8                 public string BookName { get; private set; }
 9                 public PublishEventArgs(string bookName)
10                 {
11                     this.BookName = bookName;
12                 }
13             }
14
15             public void RegisterPublish(PublishEventHandler publish)
16             {
17                 this.publish += publish;
18             }
19             public void UnRegisterPublish(PublishEventHandler publish)
20             {
21                 this.publish -= publish;
22             }
23
24             public void OnPublish(PublishEventArgs e)
25             {
26                 Console.WriteLine("OnDoPublish");
27                 if(publish != null)
28                     publish(this,e);
29             }
30
31             public void OnPublishAsyn(PublishEventArgs e)
32             {
33                 Console.WriteLine("OnDoPublish");
34                 if(publish != null) {
35                     del = publish.GetInvocationList();
36                     foreach(Delegate item in del) {
37                         PublishEventHandler Method = (PublishEventHandler)item;
38                         Method.BeginInvoke(null,e,null,null);
39                     }
40                 }
41             }
42         }

 1       public class SubScriber
 2         {
 3             private string OrderName;
 4             public SubScriber(string orderName)
 5             {
 6                 this.OrderName = orderName;
 7             }
 8
 9             public void publish(object sender,Test.Program.Publish.PublishEventArgs e)
10             {
11                 Console.WriteLine(OrderName + " Buy " + e.BookName
12                     + " " + Thread.CurrentThread.ManagedThreadId);
13                  Thread.Sleep(2000);
14             }
15         }

 1         static void Main(string[] args)
 2         {
 3             Publish pub = new Publish();
 4             SubScriber sub1 = new SubScriber("xiao zeng");
 5             SubScriber sub2 = new SubScriber("xiao Li");
 6             SubScriber sub3 = new SubScriber("xiao Wang");
 7             SubScriber sub4 = new SubScriber("xiao zhao");
 8             pub.RegisterPublish(sub1.publish);
 9             pub.RegisterPublish(sub2.publish);
10             pub.RegisterPublish(sub3.publish);
11             pub.RegisterPublish(sub4.publish);
12             pub.OnPublish(new Publish.PublishEventArgs("Tom And Jerry"));
13             pub.OnPublishAsyn(new Publish.PublishEventArgs("Tom And Jerry"));
14             Console.ReadLine();
15         }

原文地址:https://www.cnblogs.com/Lite/p/9076463.html

时间: 2024-10-26 03:45:12

C# 委托事件的异步调用的相关文章

浅谈委托,事件,异步调用,回调等概率

直接说题. 委托         首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类.字段有类型,那么方法其实也有类型,就是委托.       委托是某一类方法的总定义.    事件           事件是某个类用于传递消息的方式.事件之余委托,犹如属性之余变量即是委托的封装.     好了,明确了概念,接下来说示例.    示例         有3个对象  鼠标,button,winform .鼠标点击button对象,触发button的c

WPF 委托 事件 B窗体调用A窗体方法

原文:WPF 委托 事件 B窗体调用A窗体方法 具体实现 A窗体 中加载B窗体  B窗体触发A窗体里的方法 当点击B窗体确定Button事件   给A窗体俩个TextBox赋值 并关闭B窗体 B窗体 1)定义参数类 2)定义委托 定义委托事件 3) 定义触发事件方法 4) 触发事件方法 A窗体 1)实例化B窗体对象 2)注册定义的事件 3) 实现事件 代码 B窗体 1)定义参数类 也就是 我传过去了俩个字段(这俩个字段 让我封装成的类) //对象 public class ItemEventAr

C#中的异步调用及异步设计模式(三)——基于事件的异步模式

四.基于事件的异步模式(设计层面) 基于事件的C#异步编程模式是比IAsyncResult模式更高级的一种异步编程模式,也被用在更多的场合.该异步模式具有以下优点: ·                  “在后台”执行耗时任务(例如下载和数据库操作),但不会中断您的应用程序. ·                  同时执行多个操作,每个操作完成时都会接到通知(在通知中可以区分是完成了哪个操作). ·                  等待资源变得可用,但不会停止(“挂起”)您的应用程序. ·  

异步和多线程,委托异步调用,Thread,ThreadPool,Task,Parallel,CancellationTokenSource

1 进程-线程-多线程,同步和异步2 异步使用和回调3 异步参数4 异步等待5 异步返回值 5 多线程的特点:不卡主线程.速度快.无序性7 thread:线程等待,回调,前台线程/后台线程, 8 threadpool:线程池使用,设置线程池,ManualResetEvent9 Task初步接触 10 task:waitall waitany continueWhenAny continueWhenAll  11并行运算Parallel 12 异常处理.线程取消.多线程的临时变量和lock13 A

.Net组件程序设计之异步调用

.Net组件程序设计之异步调用 说到异步调用,在脑海中首先想到就是BeginInvoke(),在一些常用对象中我们也会常常见到Invoke()和BeginInvoke(), 要想让自己的组件可以被客户端调用或者是异步调用,这样的设计是合理的,这也是组件异步机制当中的一条 (说句题外话--其实大多数知识都隐藏在我们平时经常见到的对象或者是代码里,只不过是没有去细心的发现) 在.NET中首先就会想到使用委托来进行异步调用,关于委托的定义在 委托与事件一文中已经大概的说过了,文中只是对委托进行了 大概

客户端的异步调用

C#客户端的异步操作 阅读目录 开始 示例项目介绍 同步调用服务 异步接口介绍 1. 委托异步调用 2. 使用IAsyncResult接口实现异步调用 3. 基于事件的异步调用模式 4. 创建新线程的异步方式 5. 使用线程池的异步方式 6. 使用BackgroundWorker实现异步调用 客户端的其它代码 各种异步方式的优缺点 异步文件I/O操作 数据库的异步操作 异步设计的使用总结 在Asp.net中使用异步 上篇博客[用Asp.net写自己的服务框架] 我讲述了如何实现自己的服务框架,但

利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复(转)

利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复 打印过程可能很长,这时候有可能需要暂停下来做一些事情,然后回来继续接着打印 打印过程中有2个线程:一个是程序运行的主线程,一个是异步调用的打印线程,需要实现的是在主线程中的控件(暂停打印按纽)来控制打印线程   的暂停和恢复. ManualResetEvent就像一个信号灯,当有信号的时候(初始化为true或者有线程调用它的set()方法)就表示所有在等待(WaitOne())的线程,你们可以 继续运行了,当没有信号的

WCF初探-11:WCF客户端异步调用服务

前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码部分的执行,这时我们就需要考虑使用异步的方式来调用服务.注意这里的异步是完全针对客户端而言的,与WCF服务契约的方法是否异步无关,也就是在不改变操作契约的情况下,我们可以用同步或者异步的方式调用WCF服务. WCF客户端异步调用服务方式: 通过代理类异步调用服务.就需要通过使用事件驱动的异步调用模型

事件是异步还是同步?

初学前端的时候,资料上说事件是异步的. 根据 mdn 的描述也是异步的. 事件(Event)是指一种用于处理在网页的生命周期中发生的各种事件的异步调用的设计模式,也指一些不同种类事件的命名.描述和使用. 当时也不关心,会用就行. 后来,遇到了 HTMLElement.click var dom = document.querySelector('xxx') dom.addEventListener('click',function(){ console.log(' dom is clicked