一起谈.NET技术,C#基础之委托异步

简介:   大家知道委托就相当于C++里面的函数指针,相信大家都很很了解,看看如下简单代码来回想一下委托public delegate void Ad(); xu xus = new xu(); Ad b = new Ad(xus.

  大家知道委托就相当于C++里面的函数指针,相信大家都很很了解,看看如下简单代码来回想一下委托

 
 
public delegate void Ad();
xu xus
= new xu();
Ad b
= new Ad(xus.Add);
b
+= xus.ex;
b();
Console.ReadLine();
 
 
class xu
{
public void Add()
{
// Thread.Sleep(5000);
Console.WriteLine( " sssssssssssssssssssss " );
}
public void ex()
{
// Thread.Sleep(5000);
Console.WriteLine( " aaaaaaaaaaaaaaaaaaaaa " );
}
}

  这里我们看见 定义了一个ADD 的委托没有参数没有返回值 然后把委托指向ADD 和ex 两个方法(多播委托) 然后执行b()  执行之后 结果大家应该知道 就是执行了这2个方法打印出 "ssssssssssssss"于"aaaaaaaaaaaaaaaa"。那如果变成下面这个形式呢?

 
 
public delegate int Ad( int x, int y);
static void Main( string [] args)
{
xu xus
= new xu();
Ad a
= new Ad(Add);
a
+= ( int x, int y) => { return x - y; };
Console.WriteLine(a(
3 , 2 ));
Console.ReadLine();
}
static int Add( int x, int y)
{
// Thread.Sleep(2000);
return x + y;
}
static int ex( int x, int y)
{
// Thread.Sleep(5000);
return x - y;
}
}

  这段代码 也是执行一个多播委托 但是输出的结果会是什么样的呢 答案是 输出1,为什么前面那个委托会输出2个方法 而这个委托只会输出第二个方法的返回值?如果我们也想输出2个返回值怎么办呢?其实很简单 代码如下

 
 
public delegate int Ad( int x, int y);
static void Main( string [] args)
{
xu xus
= new xu();
Ad a
= new Ad(Add);
a
+= ( int x, int y) => { return x - y; };
Delegate[] d
= a.GetInvocationList();
for ( int i = 0 ; i < d.Length; i ++ )
{
if (d[i] is Ad)
{
Ad s
= (Ad)d[i];
Console.WriteLine(s(
3 , 2 ));
}
}
Console.ReadLine();
}
static int Add( int x, int y)
{
// Thread.Sleep(2000);
return x + y;
}
static int ex( int x, int y)
{
// Thread.Sleep(5000);
return x - y;
}
}

  这里我们使用了一个GetInvocationList 方法来返回多播委托的调用列表 然后转化ad 然后循环调用 最后显示的结果就是5,1。委托的 复习我们就看到这里 现在回到正题 看看委托的异步调用。

 
 
public delegate int Ad( int x, int y);
static void Main( string [] args)
{
xu xus
= new xu();
Ad a
= new Ad(Add);
Console.WriteLine(a(
3 , 3 ));
Console.WriteLine(
" start " );
Console.ReadLine();
}
static int Add( int x, int y)
{
Thread.Sleep(
2000 );
return x + y;
}

  运行这段代码 会先停顿2秒钟之后再显示6 和start 因为我使用了sleep这个方法 它使该线程休眠2秒钟,所以会在2秒之后显示信息,但是这对用户体验来说是非常糟糕的,那我们怎么改善呢?看看如下代码

 
 
public delegate int Ad( int x, int y);
static void Main( string [] args)
{
xu xus
= new xu();
Ad a
= new Ad(Add);
Console.WriteLine(a(
3 , 3 ));
// Console.WriteLine("start");
IAsyncResult isa = a.BeginInvoke( 3 , 3 , null , null );
while ( ! isa.IsCompleted)
{
Console.WriteLine(
" 未完成 " );
}
int s = a.EndInvoke(isa);
Console.WriteLine(s.ToString());
Console.ReadLine();
}
static int Add( int x, int y)
{
Thread.Sleep(
2000 );
return x + y;
}
static int ex( int x, int y)
{
// Thread.Sleep(5000);
return x - y;
}

  这里我们使用了begininvoke方法来异步执行 委托方法返回一个IAsyncResult 类型的值 代表委托执行的状态,使用一个while循环 来判断IsCompleted 如果没有完成异步调用则不断显示“未完成” 如果完成endinvoke 则返回结果。但是这里需要不断的询问操作完成状态 那么我们怎样让委托异步调用完成之后主动通知我们呢? 看看如下代码

 
 
public delegate int Ad( int x, int y);
static void Main( string [] args)
{
xu xus
= new xu();
Ad a
= new Ad(Add);
Console.WriteLine(a(
3 , 3 ));
IAsyncResult isa
= a.BeginInvoke( 3 , 3 , new AsyncCallback(call), " edit by xyl " );
// 执行你想执行的代码 这里我们还是用IsCompleted来代替
while ( ! isa.IsCompleted)
{
Console.WriteLine(
" 未完成 " );
}
Console.ReadLine();
}
static void call(IAsyncResult isa)
{
AsyncResult ar
= (AsyncResult)isa;
Ad a
= (Ad)ar.AsyncDelegate;
Console.WriteLine(
" this is {0},{1} " ,a.EndInvoke(isa),ar.AsyncState);
}

static int Add( int x, int y)
{
Thread.Sleep(
2000 );
return x + y;
}
static int ex( int x, int y)
{
// Thread.Sleep(5000);
return x - y;
}
}

  这里我们使用了一个call方法 注意它是没有返回值的。把IAsyncResult转换成AsyncResult注意少了个I然后转换成AD 类型的委托 最后endinvoke 来返回值 这样在委托异步执行完成之后会自动通知方法。呵呵 好了今天就说到这里吧。如果有说的不对的地方欢迎指正 大家一起学习一起进步。

目录
相关文章
|
4月前
|
监控 Cloud Native 测试技术
.NET技术深度解析:现代企业级开发指南
每日激励:“不要一直责怪过去的自己,他曾经站在雾里也很迷茫”。我是蒋星熠Jaxonic,一名在代码宇宙中探索的极客旅人。从.NET Framework到.NET 8,我深耕跨平台、高性能、云原生开发,践行领域驱动设计与微服务架构,用代码书写技术诗篇。分享架构演进、性能优化与AI融合前沿,助力开发者在二进制星河中逐光前行。关注我,共探技术无限可能!
.NET技术深度解析:现代企业级开发指南
|
10月前
|
人工智能 运维 算法
基于 C# 深度优先搜索算法的局域网集中管理软件技术剖析
现代化办公环境中,局域网集中管理软件是保障企业网络高效运行、实现资源合理分配以及强化信息安全管控的核心工具。此类软件需应对复杂的网络拓扑结构、海量的设备信息及多样化的用户操作,而数据结构与算法正是支撑其强大功能的基石。本文将深入剖析深度优先搜索(Depth-First Search,DFS)算法,并结合 C# 语言特性,详细阐述其在局域网集中管理软件中的应用与实现。
230 3
|
11月前
|
缓存 监控 算法
基于 C# 网络套接字算法的局域网实时监控技术探究
在数字化办公与网络安全需求增长的背景下,局域网实时监控成为企业管理和安全防护的关键。本文介绍C#网络套接字算法在局域网实时监控中的应用,涵盖套接字创建、绑定监听、连接建立和数据传输等操作,并通过代码示例展示其实现方式。服务端和客户端通过套接字进行屏幕截图等数据的实时传输,保障网络稳定与信息安全。同时,文章探讨了算法的优缺点及优化方向,如异步编程、数据压缩与缓存、错误处理与重传机制,以提升系统性能。
276 2
|
10月前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
415 0
|
Web App开发 Linux C#
C# 网页截图全攻略:三种技术与 Chrome 路径查找指南
本文主要介绍了在 C# 中实现网页截图的几种技术及相关要点。涵盖了 PuppeteerSharp、Selenium 和 HtmlToImage 三种方式,分别阐述了它们的安装步骤及核心代码。同时,针对在 C# 中寻找 Windows 上 chrome.exe 路径这一问题,分析了未安装 Google Chrome 和已安装两种情况下的查找原因,并给出了相关参考链接,还列举了一系列与 C# 使用 Selenium、获取 chrome.exe 路径以及在 Linux 上部署相关的参考资料。
479 11
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
234 6
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
246 6
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
477 5
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
490 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
276 7