1、定义委托:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web; namespace DelegateWebApp
{ /// <summary>
/// 定义委托
/// </summary>
/// <param name="i"></param>
/// <param name="y"></param>
/// <returns></returns>
public delegate int SumDelegate(int i,int y); public class CounterService
{ public int Sum(int i,int y)
{
return i + y;
} /// <summary>
/// 异步等待
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public int WaitSum(int a, int b)
{ for (var i = 0; i < 50; i++)
{
System.Threading.Thread.Sleep(1000);
WriteLog("WaitSum 执行时间:" + DateTime.Now.TimeOfDay.ToString() + "\r\n"); } return a + b;
} /// <summary>
/// 日志记录
/// </summary>
/// <param name="msg"></param>
public static void WriteLog(string msg)
{
// 此处不能通过 Server.Map 去获取对象
string realPath = AppDomain.CurrentDomain.BaseDirectory+"/log.txt";
FileStream fsWriter = null;
if (!File.Exists(realPath))
{
fsWriter = new FileStream(realPath, FileMode.Create);
}
else
{
fsWriter = new FileStream(realPath, FileMode.Append);
}
StreamWriter sw = new StreamWriter(fsWriter);//实现一个类,向流中写入字符
sw.WriteLine(msg);//写入流
sw.Close();//类关闭
fsWriter.Close();//流关闭
}
}
}

  

2、调用方法:

同步:

   CounterService.WriteLog("同步调用开始:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");
CounterService counterService=new CounterService ();
SumDelegate sumDellegate = new SumDelegate(counterService.Sum);
lbResult.Text=sumDellegate(10,20).ToString();
CounterService.WriteLog("同步调用完成:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");

  

异步:

  Action<IAsyncResult> action=(x)=>{
CounterService.WriteLog("异步调用Action开始:" + DateTime.Now.TimeOfDay.ToString() + "\r\n"); SumDelegate handler = (SumDelegate)((System.Runtime.Remoting.Messaging.AsyncResult)x).AsyncDelegate;
lbResult.Text = handler.EndInvoke(x).ToString() + ";" + x.AsyncState;
CounterService.WriteLog("异步调用Action结束:" + DateTime.Now.TimeOfDay.ToString() + "\r\n"); }; CounterService.WriteLog("结果输出时间:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");
lbSync.Text = "结果输出,但异步委托还在执行"; CounterService.WriteLog("异步调用开始:" + DateTime.Now.TimeOfDay.ToString() + "\r\n"); CounterService counterService = new CounterService();
SumDelegate sumDellegate = new SumDelegate(counterService.WaitSum);
IAsyncResult asyncResult = sumDellegate.BeginInvoke(, , new AsyncCallback(action), "OK:" + DateTime.Now.TimeOfDay.ToString());
CounterService.WriteLog("异步调用完成:" + DateTime.Now.TimeOfDay.ToString() + "\r\n");

代码下载地址:

.NET 同步 异步 委托的更多相关文章

  1. C#委托同步异步说明,并比较control调用Invoke和BeginInvoke的异同

    一.委托的同步和异步: 1.同步 使用Invoke调用同步,或直接写fun1("func"),在fun1.Invoke这一步会明显的阻塞线程 使用: static void Mai ...

  2. C#--委托的同步,异步,回调函数

    原文地址 同步调用 委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. using System; using System. ...

  3. C#基础之--线程、任务和同步:一、异步委托

    创建线程的一种简单方式是定义一个委托,并异步调用它.委托是方法的类型安全的引用. Delegate还支持异步地调用方法.在后台Delegate类会创建一个执行任务的线程. 为了说明委托的异步特性,从一 ...

  4. C#固定时间执行指定事件(观察者模式+异步委托)

    最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指 ...

  5. c#并行任务多种优化方案分享(异步委托)

    遇到一个多线程任务优化的问题,现在解决了,分享如下. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWeb) 任务3:验证成功 ...

  6. 6.26学习 异步委托回调函数 VS 多线程 VS 并行处理

    描述: 我现在是轮询着构建实例,然后这个实例去执行一个方法,但是执行方法需要大约10s时间,全部轮询下来需要很长时间.所以我现在要更改,头给了我两个方法,1多线程 2异步委托回调函数. 异步委托回调函 ...

  7. .net异步委托

    委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大佬使用If-Else(Switch)语句,同时使得程序 ...

  8. C# 异步委托(AP、APM)

    Ø  前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...

  9. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件

    通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二).   前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...

随机推荐

  1. 移动APP测试要点总结

    ***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***

  2. 识别TLS加密恶意流量

    利用背景流量数据(contexual flow data)识别TLS加密恶意流量 识别出加密流量中潜藏的安全威胁具有很大挑战,现已存在一些检测方法利用数据流的元数据来进行检测,包括包长度和到达间隔时间 ...

  3. 转载:【Oracle 集群】RAC知识图文详细教程(九)--RAC基本测试与使用

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  4. RabbitMq window下配置安装

    1. 搭建环境 1.1 安装Erlang语言运行环境 由于RabbitMQ使用Erlang语言编写,所以先安装Erlang语言运行环境. 1.2 Erlang(['ə:læŋ])是一种通用的面向并发的 ...

  5. PHP网站自动化配置的实现

    一直都在用yii2做项目,有在用自动化配置,但是没有自己去配置过.中午没事去看了下yii的初始化代码,发现都是php而已! yii2初始化项目代码 所以,我们做项目肯定是可以用php做的,于是我新建了 ...

  6. python 之 多线程、多进程代码

    thread-多线程 multiprocessing-多进程 #!/usr/bin/python # -*- coding:utf-8 -*- import os import threading i ...

  7. Kotlin Reference (十) Interfaces

    most from reference 接口 Kotlin中的接口非常类似于Java8,它们可以包含抽象方法的声明以及方法实现.与抽象类不同的是接口不能存储状态.它们可以具有属性,但这些需要是抽象的或 ...

  8. 三十分钟理解:双调排序Bitonic Sort,适合并行计算的排序算法

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入 双调排序是data-indepen ...

  9. iis6 , URL重写HTM文件名后,出现真实的HTM文件不能访问的解决

    服务器环境是windows 2003 IIS6 在web.config文件中加入 1.在<compilation debug="true"> 节点加入 <buil ...

  10. 毕业了-java二叉树层次遍历算法

    /*************************************** * 时间:2017年6月23日 * author:lcy * 内容:二叉树的层次遍历 * 需要借助队列这个数据结构,直 ...