iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#中怎么利用AsyncResult实现异步编程
  • 594
分享到

C#中怎么利用AsyncResult实现异步编程

2023-06-17 23:06:21 594人浏览 安东尼
摘要

这篇文章给大家介绍C#中怎么利用AsyncResult实现异步编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#异步编程模式IAsyncResult概述IAsyncResult 异步设计模式通过名为 BeginOp

这篇文章给大家介绍C#中怎么利用AsyncResult实现异步编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

C#异步编程模式IAsyncResult概述

IAsyncResult 异步设计模式通过名为 BeginOperationName 和 EndOperationName 的两个方法来实现原同步方法的异步调用,如 FileStream 类提供了 BeginRead 和 EndRead 方法来从文件异步读取字节,它们是 Read 方法的异步版本

Begin 方法包含同步方法签名中的任何参数,此外还包含另外两个参数:一个AsyncCallback 委托和一个用户定义的状态对象。委托用来调用回调方法,状态对象是用来向回调方法传递状态信息。该方法返回一个实现 IAsyncResult 接口的对象

End 方法用于结束异步操作并返回结果,因此包含同步方法签名中的 ref 和 out 参数,返回值类型也与同步方法相同。该方法还包括一个 IAsyncResult 参数,用于获取异步操作是否完成的信息,当然在使用时就必须传入对应的 Begin 方法返回的对象实例

开始异步操作后如果要阻止应用程序,可以直接调用 End 方法,这会阻止应用程序直到异步操作完成后再继续执行。也可以使用 IAsyncResult 的 AsyncWaitHandle 属性,调用其中的WaitOne等方法来阻塞线程。这两种方法的区别不大,只是前者必须一直等待而后者可以设置等待超时

如果不阻止应用程序,则可以通过轮循 IAsyncResult 的 IsCompleted 状态来判断操作是否完成,或使用 AsyncCallback 委托来结束异步操作。AsyncCallback 委托包含一个 IAsyncResult 的签名,回调方法内部再调用 End 方法来获取操作执行结果

C#异步编程模式IAsyncResult之IAsyncResult 接口

public interface IAsyncResult  {  object AsyncState { get; }  WaitHandle AsyncWaitHandle { get; }  bool CompletedSynchronously { get; }  bool IsCompleted { get; }  }

我用一个 AsyncDemo 类作为异步方法的提供者,后面的程序都会调用它。内部很简单,构造函数接收一个字符串作为 name ,Run 方法输出 "My name is " + name ,而异步方法直接用委托的 BeginInvoke 和 EndInvoke 方法实现

public class AsyncDemo  {  // Use in asynchronous methods  private delegate string runDelegate();   private string m_Name;  private runDelegate m_Delegate;   public AsyncDemo(string name)  {  m_Name = name;  m_Delegate = new runDelegate(Run);  }   /// ﹤summary﹥  /// Synchronous method  /// ﹤/summary﹥  /// ﹤returns﹥﹤/returns﹥  public string Run()  {  return "My name is " + m_Name;  }   /// ﹤summary﹥  /// Asynchronous begin method  /// ﹤/summary﹥  /// ﹤param name="callBack"﹥﹤/param﹥  /// ﹤param name="stateObject"﹥﹤/param﹥  /// ﹤returns﹥﹤/returns﹥  public IAsyncResult BeginRun(  AsyncCallback callBack, Object stateObject)  {  try {  return m_Delegate.BeginInvoke(callBack, stateObject);  }  catch(Exception e)  {  // Hide inside method invoking stack  throw e;  }  }   /// ﹤summary﹥  /// Asynchronous end method  /// ﹤/summary﹥  /// ﹤param name="ar"﹥﹤/param﹥  /// ﹤returns﹥﹤/returns﹥  public string EndRun(IAsyncResult ar)  {  if (ar == null)  throw new NullReferenceException(  "Arggument ar can't be null");   try {  return m_Delegate.EndInvoke(ar);  }  catch (Exception e)  {  // Hide inside method invoking stack  throw e;  }  }  }

C#异步编程模式IAsyncResult操作步骤:首先是 Begin 之后直接调用 End 方法,当然中间也可以做其他的操作

class AsyncTest  {  static void Main(string[] args)  {  AsyncDemo demo = new AsyncDemo("jiangnii");   // Execute begin method  IAsyncResult ar = demo.BeginRun(null, null);   // You can do other things here   // Use end method to block thread  // until the operation is complete  string demoName = demo.EndRun(ar);  Console.WriteLine(demoName);  }  }

也可以用 IAsyncResult 的 AsyncWaitHandle 属性,我在这里设置为1秒超时

class AsyncTest  {  static void Main(string[] args)  {  AsyncDemo demo = new AsyncDemo("jiangnii");   // Execute begin method  IAsyncResult ar = demo.BeginRun(null, null);   // You can do other things here   // Use AsyncWaitHandle.WaitOne method to block thread for 1 second at most  ar.AsyncWaitHandle.WaitOne(1000, false);   if (ar.IsCompleted)  {  // Still need use end method to get result,  // but this time it will return immediately   string demoName = demo.EndRun(ar);  Console.WriteLine(demoName);  }  else {  Console.WriteLine("Sorry,  can't get demoName, the time is over");  }  }  }

C#异步编程模式IAsyncResult要注意的还有:不中断的循环,每次循环输出一个 "."

class AsyncTest  {  static void Main(string[] args)  {  AsyncDemo demo = new AsyncDemo("jiangnii");   // Execute begin method  IAsyncResult ar = demo.BeginRun(null, null);   Console.Write("Waiting..");  while (!ar.IsCompleted)  {  Console.Write(".");  // You can do other things here  }  Console.WriteLine();   // Still need use end method to get result,   //but this time it will return immediately   string demoName = demo.EndRun(ar);  Console.WriteLine(demoName);  }  }

***是使用回调方法并加上状态对象,状态对象被作为 IAsyncResult 参数的 AsyncState 属性被传给回调方法。回调方法执行前不能让主线程退出,我这里只是简单的让其休眠了1秒。另一个与之前不同的地方是 AsyncDemo 对象被定义成了类的静态字段,以便回调方法使用

class AsyncTest  {  static AsyncDemo demo = new AsyncDemo("jiangnii");   static void Main(string[] args)  {  // State object  bool state = false;   // Execute begin method  IAsyncResult ar = demo.BeginRun(  new AsyncCallback(outPut), state);   // You can do other thins here   // Wait until callback finished  System.Threading.Thread.Sleep(1000);  }   // Callback method  static void outPut(IAsyncResult ar)  {  bool state = (bool)ar.AsyncState;  string demoName = demo.EndRun(ar);   if (state)  {  Console.WriteLine(demoName);  }  else {  Console.WriteLine(demoName + ", isn't it?");  }  }  }

C#异步编程模式IAsyncResult的后话:

对于一个已经实现了 BeginOperationName 和 EndOperationName方法的对象,我们可以直接用上述方式调用,但对于只有同步方法的对象,我们要对其进行异步调用也不需要增加对应的异步方法,而只需定义一个委托并使用其 BeginInvoke 和 EndInvoke 方法就可以了。

关于C#中怎么利用AsyncResult实现异步编程就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: C#中怎么利用AsyncResult实现异步编程

本文链接: https://www.lsjlt.com/news/294423.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#中怎么利用AsyncResult实现异步编程
    这篇文章给大家介绍C#中怎么利用AsyncResult实现异步编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#异步编程模式IAsyncResult概述IAsyncResult 异步设计模式通过名为 BeginOp...
    99+
    2023-06-17
  • Python中怎么利用Asyncio实现异步编程
    本篇文章为大家展示了Python中怎么利用Asyncio实现异步编程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。异步是怎么一回事在传统的顺序编程中, 所有发送给解释器的指令会一条条被执行。此类代码...
    99+
    2023-06-17
  • C#中怎么实现异步网络编程
    这期内容当中小编将会给大家带来有关C#中怎么实现异步网络编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#异步网络编程两大方法一、Asynchronous Sockets的方法Socket类的很多连接...
    99+
    2023-06-17
  • C#中怎么利用Socket实现异步通讯
    这篇文章将为大家详细讲解有关C#中怎么利用Socket实现异步通讯,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C# Socket异步通讯客户端之主程序:using System;using...
    99+
    2023-06-17
  • C#中怎么利用委托实现异步调用
    这篇文章将为大家详细讲解有关C#中怎么利用委托实现异步调用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。委托实现C#异步调用的步骤:定义委托。将要进行异步调用的方法“实例化”到定义的委托。在...
    99+
    2023-06-17
  • SpringBoot 中怎么实现异步编程
    这期内容当中小编将会给大家带来有关SpringBoot 中怎么实现异步编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Future 模式异步编程在处理耗时操作以及多任务...
    99+
    2024-04-02
  • C#怎么使用async和await实现异步编程
    这篇文章主要介绍“C#怎么使用async和await实现异步编程”,在日常操作中,相信很多人在C#怎么使用async和await实现异步编程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么使用async...
    99+
    2023-07-02
  • java中怎么利用FutureTask实现异常编程
    这期内容当中小编将会给大家带来有关java中怎么利用FutureTask实现异常编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。说明FutureTask类不仅实现了Future接口还实现了Runnabl...
    99+
    2023-06-20
  • Python 中怎么使用Asyncio实现异步编程
    Python 中怎么使用Asyncio实现异步编程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。异步是怎么一回事在传统的顺序编程中, 所有发送给解释器的指令会一条条被执行。...
    99+
    2023-06-17
  • C#BeginInvoke实现异步编程方式
    目录1.等待模式2.轮询模式3.回调模式总结BeginInvoke实现异步编程的三种模式: 1.等待模式 在发起了异步方法以及做了一些其他处理之后,原始线程就中断并且等异步方法完成...
    99+
    2023-01-28
    C# BeginInvoke C#异步编程 C# BeginInvoke异步编程
  • C#中怎么实现异步调用
    C#中怎么实现异步调用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先,C#异步调用出来的新线程,必须回收,不回收是浪费资源的可耻行为,.NET也是不允许的,所以你别想钻...
    99+
    2023-06-17
  • 如何用 C++ 函数实现异步编程?
    摘要: c++++ 中的异步编程允许多任务处理,无需等待耗时操作。使用函数指针创建指向函数的指针。回调函数在异步操作完成时被调用。boost::asio 等库提供异步编程支持。实战案例演...
    99+
    2024-04-27
    c++ 异步编程
  • C#使用async和await实现异步编程
    最近在写程序的时候,经常遇到大量需要异步访问的情况,但是对于async和await到底怎么写,还不是非常明确。 1.普通的程序怎么写? class Program { sta...
    99+
    2024-04-02
  • PHP异步编程:如何利用Windows API实现高效编程?
    随着互联网技术的发展,Web应用程序的性能和响应速度越来越受到关注。为了提高Web应用程序的性能,开发人员开始采用异步编程技术。PHP是一种流行的Web编程语言,它提供了一些异步编程的支持。但是,PHP的异步编程模型在Windows平台上...
    99+
    2023-06-04
    异步编程 api windows
  • 如何利用Linux平台实现Java异步编程?
    在当前的互联网时代,高并发是一个常见的问题,而异步编程则是解决高并发的有效方式之一。Java作为一门成熟的编程语言,也提供了异步编程的解决方案,本文将介绍如何利用Linux平台实现Java异步编程。 什么是异步编程? 在传统的同步编程中,程...
    99+
    2023-10-15
    分布式 linux 异步编程
  • golang函数如何利用goroutine实现异步编程?
    go 语言中使用 goroutine 实现异步编程。 goroutine 是一种轻量级线程,可以通过 go 关键字异步执行函数。 例如,在并发处理文件时,多个 goroutine 可以并...
    99+
    2024-05-02
    异步编程 golang
  • Android Flutter异步编程怎么实现
    这篇文章主要介绍“Android Flutter异步编程怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android Flutter异步编程怎么实现”文章能帮助大家解决问...
    99+
    2023-07-05
  • C#中怎么利用异步实现一个进度条效果
    本篇文章给大家分享的是有关C#中怎么利用异步实现一个进度条效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#进度条实现之异步实例进度条页面://==============...
    99+
    2023-06-17
  • JavaScript中怎么利用Jscex改善异步编程体验
    JavaScript中怎么利用Jscex改善异步编程体验,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JavaScript是互联网时代编程语言...
    99+
    2024-04-02
  • 怎么在python中利用asyncio实现异步IO
    这篇文章给大家介绍怎么在python中利用asyncio实现异步IO,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作