.NET 同步 异步 委托
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 同步 异步 委托的更多相关文章
- C#委托同步异步说明,并比较control调用Invoke和BeginInvoke的异同
一.委托的同步和异步: 1.同步 使用Invoke调用同步,或直接写fun1("func"),在fun1.Invoke这一步会明显的阻塞线程 使用: static void Mai ...
- C#--委托的同步,异步,回调函数
原文地址 同步调用 委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. using System; using System. ...
- C#基础之--线程、任务和同步:一、异步委托
创建线程的一种简单方式是定义一个委托,并异步调用它.委托是方法的类型安全的引用. Delegate还支持异步地调用方法.在后台Delegate类会创建一个执行任务的线程. 为了说明委托的异步特性,从一 ...
- C#固定时间执行指定事件(观察者模式+异步委托)
最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指 ...
- c#并行任务多种优化方案分享(异步委托)
遇到一个多线程任务优化的问题,现在解决了,分享如下. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWeb) 任务3:验证成功 ...
- 6.26学习 异步委托回调函数 VS 多线程 VS 并行处理
描述: 我现在是轮询着构建实例,然后这个实例去执行一个方法,但是执行方法需要大约10s时间,全部轮询下来需要很长时间.所以我现在要更改,头给了我两个方法,1多线程 2异步委托回调函数. 异步委托回调函 ...
- .net异步委托
委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大佬使用If-Else(Switch)语句,同时使得程序 ...
- C# 异步委托(AP、APM)
Ø 前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件
通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二). 前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...
随机推荐
- 移动APP测试要点总结
***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***
- 识别TLS加密恶意流量
利用背景流量数据(contexual flow data)识别TLS加密恶意流量 识别出加密流量中潜藏的安全威胁具有很大挑战,现已存在一些检测方法利用数据流的元数据来进行检测,包括包长度和到达间隔时间 ...
- 转载:【Oracle 集群】RAC知识图文详细教程(九)--RAC基本测试与使用
文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...
- RabbitMq window下配置安装
1. 搭建环境 1.1 安装Erlang语言运行环境 由于RabbitMQ使用Erlang语言编写,所以先安装Erlang语言运行环境. 1.2 Erlang(['ə:læŋ])是一种通用的面向并发的 ...
- PHP网站自动化配置的实现
一直都在用yii2做项目,有在用自动化配置,但是没有自己去配置过.中午没事去看了下yii的初始化代码,发现都是php而已! yii2初始化项目代码 所以,我们做项目肯定是可以用php做的,于是我新建了 ...
- python 之 多线程、多进程代码
thread-多线程 multiprocessing-多进程 #!/usr/bin/python # -*- coding:utf-8 -*- import os import threading i ...
- Kotlin Reference (十) Interfaces
most from reference 接口 Kotlin中的接口非常类似于Java8,它们可以包含抽象方法的声明以及方法实现.与抽象类不同的是接口不能存储状态.它们可以具有属性,但这些需要是抽象的或 ...
- 三十分钟理解:双调排序Bitonic Sort,适合并行计算的排序算法
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入 双调排序是data-indepen ...
- iis6 , URL重写HTM文件名后,出现真实的HTM文件不能访问的解决
服务器环境是windows 2003 IIS6 在web.config文件中加入 1.在<compilation debug="true"> 节点加入 <buil ...
- 毕业了-java二叉树层次遍历算法
/*************************************** * 时间:2017年6月23日 * author:lcy * 内容:二叉树的层次遍历 * 需要借助队列这个数据结构,直 ...