广告
返回顶部
首页 > 资讯 > 精选 >C#如何实现异步操作
  • 412
分享到

C#如何实现异步操作

2023-06-18 00:06:35 412人浏览 安东尼
摘要

这篇文章给大家分享的是有关C#如何实现异步操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。.net Framework 为异步操作提供了两种设计模式:使用 IAsyncResult 对象的异步操作与使用事件的异

这篇文章给大家分享的是有关C#如何实现异步操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

.net Framework 为异步操作提供了两种设计模式:使用 IAsyncResult 对象的异步操作与使用事件的异步操作。先来学习前者

概述

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

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

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

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

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

尝试

先来熟悉一下今天的主角,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);  }  ///  /// Synchronous method  ///  ///  public string Run()  {  return "My name is " + m_Name;  }  ///  /// Asynchronous begin method  ///  ///  ///  ///  public IAsyncResult BeginRun(AsyncCallback callBack, Object stateObject)  {  try  {  return m_Delegate.BeginInvoke(callBack, stateObject);  }  catch(Exception e)  {  // Hide inside method invoking stack  throw e;  }  }  ///  /// Asynchronous end method  ///  ///  ///  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;  }  }  }

首先是 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 demodemoName = 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 demodemoName = demo.EndRun(ar);  Console.WriteLine(demoName);  }  else  {  Console.WriteLine("Sorry, can't get demoName, the time is over");  }  }  }

不中断的轮循,每次循环输出一个 "."

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 demodemoName = 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 demodemoName = demo.EndRun(ar);  if (state)  {  Console.WriteLine(demoName);  }  else  {  Console.WriteLine(demoName + ", isn't it?");  }  }  }

C#异步操作总结

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

感谢各位的阅读!关于“C#如何实现异步操作”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: C#如何实现异步操作

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

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

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

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

下载Word文档
猜你喜欢
  • C#如何实现异步操作
    这篇文章给大家分享的是有关C#如何实现异步操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。.NET Framework 为异步操作提供了两种设计模式:使用 IAsyncResult 对象的异步操作与使用事件的异...
    99+
    2023-06-18
  • C#中怎么实现异步操作
    C#中怎么实现异步操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。//首先准备好,要进行异步的方法(能异步的,***不多线程)  private ...
    99+
    2023-06-17
  • C++中怎么实现异步操作
    C++中怎么实现异步操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实现(代码)#include <iostream> #include&nb...
    99+
    2023-06-17
  • C#中怎么实现长异步操作
    本篇文章为大家展示了C#中怎么实现长异步操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。程序中执行按钮的Click 处理如下:private void _btnRun_Clic...
    99+
    2023-06-18
  • ES6中javascript如何实现异步操作
    这篇文章主要为大家展示了“ES6中javascript如何实现异步操作”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ES6中javascript如何实现异步操作...
    99+
    2022-10-19
  • C#如何使用Task执行异步操作
    目录为什么要使用 Task Task 和 Thread 区别 Task 介绍 Task 简单实现 Task 执行状态 1.等待(Wait) 2. 返回值 3. Task.Delay ...
    99+
    2022-11-12
  • PHP怎么实现异步操作
    这篇文章主要讲解了“PHP怎么实现异步操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP怎么实现异步操作”吧!1.为啥PHP需要异步操作?一般来说PHP适用的场合是web页面展示等耗时...
    99+
    2023-06-04
  • C#操作DataTable的实现步骤
    目录一、表创建一、表创建二、创建列 -并填充值(添加新数据行) (dt什么都没有、无结构)三、向有结构的dt中添加新数据行四、添加新数据行到dt中的指定位置五、赋值和取值六、筛选行七...
    99+
    2023-05-14
    C#操作DataTable C# DataTable操作
  • C#中如何实现异步调用
    C#中如何实现异步调用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。.NET Framework 允许您C#异步调用任何方法。定义与您需要调用的方法具有相同签名...
    99+
    2023-06-17
  • ADO.NET中怎么实现异步操作
    ADO.NET中怎么实现异步操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。线程是允许程序的一部分独立于其他部分运行。线程可以在单个线程执行的同时运行多个操作,让用户感到像同...
    99+
    2023-06-17
  • c# 几个常见的TAP异步操作
    目录1 任务状态手动控制任务启动确保任务已激活2 任务取消3 进度报告4 Task.Yield 让步5 定制异步任务后续操作ConfigureAwaitContinueWith6 总...
    99+
    2022-11-12
  • C#中如何实现异步套接字
    这篇文章将为大家详细讲解有关C#中如何实现异步套接字,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。创建一个连接到服务器的客户端。该客户端是用C#异步套接字生成的,因此在等待服务器返回响应时不...
    99+
    2023-06-17
  • Flutter异步操作实现流程详解
    目录一、FutureBuilder二、StreamBuilder在Flutter中,借助 FutureBuilder 组件和 StreamBuilder 组件,可以非常方便地完成异步...
    99+
    2022-11-13
  • JavaScript异步编程操作实现介绍
    目录异步编程同步模式与异步模式同步模式(Synchronous)异步模式(Asynchronous)回调函数PromisePromise基本用法Promise使用案例Promise常...
    99+
    2022-11-13
  • 如何在Go语言中实现异步文件操作?
    在Go语言中,文件操作是必不可少的一部分。然而,有时候我们需要进行异步文件操作,以避免阻塞主线程。那么,如何在Go语言中实现异步文件操作呢?本文将为您详细介绍。 一、使用goroutine实现异步文件操作 在Go语言中,可以通过gorout...
    99+
    2023-09-24
    异步编程 文件 关键字
  • ASP异步编程和Laravel响应:如何在Web应用中实现异步操作?
    在Web应用中,异步操作是非常重要的功能,特别是对于需要大量计算的任务,例如下载、上传、数据库查询等等。异步操作可以使得Web应用更加高效和快速,提高用户的体验和满意度。在本文中,我们将探讨ASP异步编程和Laravel响应,以及如何在W...
    99+
    2023-08-18
    异步编程 laravel 响应
  • C++异步操作future和aysnc与function和bind
    目录异步操作std::future和std::aysnc 介绍std::future和std::aysnc的使用Demostd::packaged_task 介绍std::packa...
    99+
    2022-11-13
  • C++ BoostAsyncSocket如何实现异步反弹通信
    这篇文章主要介绍“C++ BoostAsyncSocket如何实现异步反弹通信”,在日常操作中,相信很多人在C++ BoostAsyncSocket如何实现异步反弹通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-07-05
  • PHP中如何实现异步编程时的数组操作?
    在PHP中,数组是一个非常常见的数据结构,它可以用来存储一组相关的数据。在异步编程中,对数组的操作也是非常常见的。本文将介绍PHP中如何实现异步编程时的数组操作。 1.使用swoole的协程 在PHP中,可以使用swoole的协程来实现异...
    99+
    2023-10-30
    数组 异步编程 重定向
  • PHP异步编程技术:如何实现重定向操作?
    在Web开发中,重定向操作是非常常见的一种技术。它能够将用户从当前页面重定向到另一个页面,从而实现页面跳转。在PHP中,我们可以使用异步编程技术来实现重定向操作。本文将介绍如何使用PHP异步编程技术实现重定向操作,并附有相应的演示代码。 ...
    99+
    2023-06-20
    异步编程 重定向 开发技术
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作