一起谈.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 来返回值 这样在委托异步执行完成之后会自动通知方法。呵呵 好了今天就说到这里吧。如果有说的不对的地方欢迎指正 大家一起学习一起进步。

目录
相关文章
|
13天前
|
开发框架 .NET 中间件
C#/.NET快速上手学习资料集(让现在的自己不再迷茫)
C#/.NET快速上手学习资料集(让现在的自己不再迷茫)
|
4天前
|
XML 开发框架 .NET
C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作
C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作
|
5天前
|
C#
C#同步异步详解
C#同步异步详解
7 0
|
5天前
|
C#
c#委托详解
c#委托详解
7 0
|
14天前
|
人工智能 开发框架 量子技术
【专栏】.NET 技术:驱动创新的力量
【4月更文挑战第29天】.NET技术,作为微软的开发框架,以其跨平台、开源和语言多样性驱动软件创新。它在云计算、AI/ML、混合现实等领域发挥关键作用,通过Azure、ML.NET等工具促进新兴技术发展。未来,.NET将涉足量子计算、微服务和无服务器计算,持续拓宽软件开发边界,成为创新的重要推动力。掌握.NET技术,对于开发者而言,意味着握有开启创新的钥匙。
|
14天前
|
开发框架 .NET C#
【专栏】理解.NET 技术,提升开发水平
【4月更文挑战第29天】本文介绍了.NET技术的核心概念和应用,包括其跨平台能力、性能优化、现代编程语言支持及Web开发等特性。文章强调了深入学习.NET技术、关注社区动态、实践经验及学习现代编程理念对提升开发水平的重要性。通过这些,开发者能更好地利用.NET构建高效、可维护的多平台应用。
|
14天前
|
机器学习/深度学习 vr&ar 开发者
【专栏】.NET 技术:引领开发新方向
【4月更文挑战第29天】本文探讨了.NET技术如何引领软件开发新方向,主要体现在三方面:1) 作为跨平台开发的先锋,.NET Core支持多操作系统和移动设备,借助.NET MAUI创建统一UI,适应物联网需求;2) 提升性能和开发者生产力,采用先进技术和优化策略,同时更新C#语言特性,提高代码效率和可维护性;3) 支持现代化应用架构,包括微服务、容器化,集成Kubernetes和ASP.NET Core,保障安全性。此外,.NET还不断探索AI、ML和AR/VR技术,为软件开发带来更多创新可能。
|
14天前
|
开发框架 Cloud Native 开发者
【专栏】剖析.NET 技术的核心竞争力
【4月更文挑战第29天】本文探讨了.NET框架在软件开发中的核心竞争力:1) .NET Core实现跨平台与云原生技术的融合,支持多操作系统和容器化;2) 提升性能和开发者生产力,采用JIT、AOT优化,提供C#新特性和Roslyn编译器平台;3) 支持现代化应用架构,包括微服务和容器化,内置安全机制;4) 丰富的生态系统和社区支持,拥有庞大的开发者社区和微软的持续投入。这些优势使.NET在竞争激烈的市场中保持领先地位。
|
14天前
|
开发框架 .NET 开发者
【专栏】领略.NET 技术的创新力量
【4月更文挑战第29天】.NET技术自ASP.NET起历经创新,现以.NET Core为核心,展现跨平台能力,提升性能与生产力,支持现代化应用架构。.NET Core使开发者能用同一代码库在不同操作系统上构建应用,扩展至移动和物联网领域。性能提升,C#新特性简化编程,Roslyn编译器优化代码。拥抱微服务、容器化,内置安全机制,支持OAuth等标准。未来.NET 6将引入更快性能、Hot Reload等功能,预示着.NET将持续引领软件开发潮流,为开发者创造更多机会。
|
14天前
|
物联网 vr&ar 开发者
【专栏】.NET 技术:为开发注入活力
【4月更文挑战第29天】本文探讨了.NET技术的创新,主要体现在三个方面:1) .NET Core实现跨平台开发革命,支持多种操作系统和硬件,如.NET MAUI用于多平台UI;2) 性能提升与生产力飞跃,C#新特性简化编程,JIT和AOT优化提升性能,Roslyn提供代码分析工具;3) 引领现代化应用架构,支持微服务、容器化,内置安全机制。未来,.NET 7将带来更多新特性和前沿技术整合,如量子计算、AI,持续推动软件开发创新。开发者掌握.NET技术将赢得竞争优势。