返回顶部
首页 > 资讯 > 精选 >基于事件的异步编程模式EMP如何理解
  • 110
分享到

基于事件的异步编程模式EMP如何理解

2023-06-17 09:06:11 110人浏览 薄情痞子
摘要

基于事件的异步编程模式EMP如何理解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。.net1.0中基于IAsyncResult设计模式的异步编程模型(APM),它使用Sys

基于事件的异步编程模式EMP如何理解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

.net1.0中基于IAsyncResult设计模式的异步编程模型(APM),它使用System.Threading命名空间的类来构造多线程应用程序。然而要想有效地使用这些工具类,需要有丰富的使用多线程软件工程的经验。对于相对简单的多线程应用程序,BackgroundWorker组件提供了一个简单的解决方案。对于更复杂的异步应用程序,可以考虑实现一个符合基于事件的异步模式的类。

使用支持此模式的类,您将能够:

1) 异步执行耗时的任务。

2) 获得进度报告和增量结果。

3) 支持耗时任务的取消。

4) 获得任务的结果值或异常信息。

5) 更复杂:支持同时执行多个异步操作、进度报告、增量结果、取消操作、返回结果值或异常信息。

源码下载:异步编程:基于事件的异步模型(EAP).rar

为了实现基于事件的异步模式,我们必须先理解两个重要的帮助器类:

AsyncOperationManager和AsyncOperation

AsyncOperationManager类和AsyncOperation类是System.ComponentModel命名空间为我们提供了两个重要帮助器类。在基于事件的异步模式封装标准化的异步功能中,它确保你的异步操作支持在各种应用程序模型(包括 asp.net、控制台应用程序和 windows 窗体应用程序)的适当“线程或上下文”调用客户端事件处理程序。

AsyncOperationManager类和AsyncOperation类的api如下:

// 为支持异步方法调用的类提供并发管理。此类不能被继承。  public static class AsyncOperationManager  {      // 获取或设置用于异步操作的同步上下文。      public static SynchronizationContext SynchronizationContext { get; set; }         // 返回可用于对特定异步操作的持续时间进行跟踪的AsyncOperation对象。      // 参数:userSuppliedState:      //     一个对象,用于使一个客户端状态(如任务 ID)与一个特定异步操作相关联。      public static AsyncOperation CreateOperation(object userSuppliedState)      {          return AsyncOperation.CreateOperation(userSuppliedState,SynchronizationContext);      }  }     // 跟踪异步操作的生存期。  public sealed class AsyncOperation  {      // 构造函数      private AsyncOperation(object userSuppliedState, SynchronizationContext syncContext);      internal static AsyncOperation CreateOperation(object userSuppliedState                                              , SynchronizationContext syncContext);         // 获取传递给构造函数的SynchronizationContext对象。      public SynchronizationContext SynchronizationContext { get; }      // 获取或设置用于唯一标识异步操作的对象。      public object UserSuppliedState { get; }         // 在各种应用程序模型适合的线程或上下文中调用委托。      public void Post(SendOrPostCallback d, object arg);      // 结束异步操作的生存期。      public void OperationCompleted();      // 效果同调用 Post() + OperationCompleted() 方法组合      public void PostOperationCompleted(SendOrPostCallback d, object arg);  }

先分析下这两个帮助器类:

AsyncOperationManager是静态类。静态类是密封的,因此不可被继承。倘若从静态类继承会报错“静态类必须从 Object 派生”。(小常识,以前以为密封类就是 sealed 关键字)

AsyncOperationManager为支持异步方法调用的类提供并发管理,该类可正常运行于 .NET Framework 支持的所有应用程序模式下。

AsyncOperation实例提供对特定异步任务的生存期进行跟踪。可用来处理任务完成通知,还可用于在不终止异步操作的情况下发布进度报告和增量结果(这种不终止异步操作的处理是通过AsyncOperation的 Post() 方法实现)。

AsyncOperation类有一个私有的构造函数和一个内部CreateOperation() 静态方法。由AsyncOperationManager类调用AsyncOperation.CreateOperation() 静态方法来创建AsyncOperation实例。

AsyncOperation类是通过SynchronizationContext类来实现在各种应用程序的适当“线程或上下文”调用客户端事件处理程序。

// 提供在各种同步模型中传播同步上下文的基本功能。  public class SynchronizationContext  {      // 获取当前线程的同步上下文。      public static SynchronizationContext Current { get; }         // 当在派生类中重写时,响应操作已开始的通知。      public virtual void OperationStarted();      // 当在派生类中重写时,将异步消息调度到一个同步上下文。      public virtual void Post(SendOrPostCallback d, object state);      // 当在派生类中重写时,响应操作已完成的通知。      public virtual void OperationCompleted();      ……  }

a) 在AsyncOperation构造函数中调用SynchronizationContext的OperationStarted() ;

b) 在AsyncOperation的 Post() 方法中调用SynchronizationContext的Post() ;

c) 在AsyncOperation的OperationCompleted()方法中调用SynchronizationContext的OperationCompleted();

SendOrPostCallback委托签名:

// 表示在消息即将被调度到同步上下文时要调用的方法。  public delegate void SendOrPostCallback(object state);

基于事件的异步模式的特征

基于事件的异步模式可以采用多种形式,具体取决于某个特定类支持操作的复杂程度:

1) 最简单的类可能只有一个 ***Async方法和一个对应的 ***Completed 事件,以及这些方法的同步版本。

2) 复杂的类可能有若干个 ***Async方法,每种方法都有一个对应的 ***Completed 事件,以及这些方法的同步版本。

3) 更复杂的类还可能为每个异步方法支持取消(CancelAsync()方法)、进度报告和增量结果(ReportProgress() 方法+ProgressChanged事件)。

4) 如果您的类支持多个异步方法,每个异步方法返回不同类型的数据,您应该:

a) 将您的增量结果报告与您的进度报告分开。

b) 使用适当的EventArgs为每个异步方法定义一个单独的 ***ProgressChanged事件以处理该方法的增量结果数据。

5) 如果类不支持多个并发调用,请考虑公开IsBusy属性。

6) 如要异步操作的同步版本中有 Out 和 Ref 参数,它们应做为对应 ***CompletedEventArgs的一部分,eg:

public int MethodName(string arg1, ref string arg2, out string arg3);     public void MethodNameAsync(string arg1, string arg2);  public class MethodNameCompletedEventArgs : AsyncCompletedEventArgs  {      public int Result { get; };      public string Arg2 { get; };      public string Arg3 { get; };  }

如果你的组件要支持多个异步耗时的任务并行执行。那么:

1) 为***Async方法多添加一个userState对象参数(此参数应当始终是***Async方法签名中的最后一个参数),用于跟踪各个操作的生存期。

2) 注意要在你构建的异步类中维护一个userState对象的集合。使用 lock 区域保护此集合,因为各种调用都会在此集合中添加和移除userState对象。

3) 在***Async方法开始时调用AsyncOperationManager.CreateOperation并传入userState对象,为每个异步任务创建AsyncOperation对象,userState存储在AsyncOperation的UserSuppliedState属性中。在构建的异步类中使用该属性标识取消的操作,并传递给CompletedEventArgs和ProgressChangedEventArgs参数的UserState属性来标识当前引发进度或完成事件的特定异步任务。

4) 当对应于此userState对象的任务引发完成事件时,你构建的异步类应将AsyncCompletedEventArgs.UserState对象从集合中删除。

注意:

1) 确保 ***EventArgs类特定于***方法。即当使用 ***EventArgs类时,切勿要求开发人员强制转换类型值。

2) 确保始终引发方法名称Completed 事件。成功完成、异常或者取消时应引发此事件。任何情况下,应用程序都不应遇到这样的情况:应用程序保持空闲状态,而操作却一直不能完成。

3) 确保可以捕获异步操作中发生的任何异常并将捕获的异常指派给 Error 属性。

4) 确保 ***CompletedEventArgs 类将其成员公开为只读属性而不是字段,因为字段会阻止数据绑定。eg:public MyReturnType Result { get; }

5) 在构建 ***CompletedEventArgs 类属性时,通过this.RaiseExceptionIfNecessary() 方法确保属性值被正确使用。Eg:

public int MethodName(string arg1, ref string arg2, out string arg3);     public void MethodNameAsync(string arg1, string arg2);  public class MethodNameCompletedEventArgs : AsyncCompletedEventArgs  {      public int Result { get; };      public string Arg2 { get; };      public string Arg3 { get; };  }

如果你的组件要支持多个异步耗时的任务并行执行。那么:

1) 为***Async方法多添加一个userState对象参数(此参数应当始终是***Async方法签名中的最后一个参数),用于跟踪各个操作的生存期。

2) 注意要在你构建的异步类中维护一个userState对象的集合。使用 lock 区域保护此集合,因为各种调用都会在此集合中添加和移除userState对象。

3) 在***Async方法开始时调用AsyncOperationManager.CreateOperation并传入userState对象,为每个异步任务创建AsyncOperation对象,userState存储在AsyncOperation的UserSuppliedState属性中。在构建的异步类中使用该属性标识取消的操作,并传递给CompletedEventArgs和ProgressChangedEventArgs参数的UserState属性来标识当前引发进度或完成事件的特定异步任务。

4) 当对应于此userState对象的任务引发完成事件时,你构建的异步类应将AsyncCompletedEventArgs.UserState对象从集合中删除。

注意:

1) 确保 ***EventArgs类特定于***方法。即当使用 ***EventArgs类时,切勿要求开发人员强制转换类型值。

2) 确保始终引发方法名称Completed 事件。成功完成、异常或者取消时应引发此事件。任何情况下,应用程序都不应遇到这样的情况:应用程序保持空闲状态,而操作却一直不能完成。

3) 确保可以捕获异步操作中发生的任何异常并将捕获的异常指派给 Error 属性。

4) 确保 ***CompletedEventArgs 类将其成员公开为只读属性而不是字段,因为字段会阻止数据绑定。eg:public MyReturnType Result { get; }

5) 在构建 ***CompletedEventArgs 类属性时,通过this.RaiseExceptionIfNecessary() 方法确保属性值被正确使用。Eg:

private bool isPrimeValue;  public bool IsPrime  {      get      {          RaiseExceptionIfNecessary();          return isPrimeValue;      }  }

所以,在***Completed事件处理程序中,应当总是先检查 ***CompletedEventArgs.Error 和 ***CompletedEventArgs.Cancelled 属性,然后再访问RunWorkerCompletedEventArgs.Result属性。

BackgroundWorker组件

System.ComponentModel命名空间的BackgroundWorker组件为我们提供了一个简单的多线程应用解决方案,它允许你在单独的线程上运行耗时操作而不会导致用户界面的阻塞。但是,要注意它同一时刻只能运行一个异步耗时操作(使用IsBusy属性判定),并且不能跨AppDomain边界进行封送处理(不能在多个AppDomain中执行多线程操作)。

1. BackgroundWorker组件

public class BackgroundWorker : Component  {      public BackgroundWorker();         // 获取一个值,指示应用程序是否已请求取消后台操作。      public bool CancellationPending { get; }      // 获取一个值,指示BackgroundWorker是否正在运行异步操作。      public bool IsBusy { get; }      // 获取或设置一个值,该值指示BackgroundWorker能否报告进度更新。      public bool WorkerReportsProgress { get; set; }      // 获取或设置一个值,该值指示BackgroundWorker是否支持异步取消。      public bool WorkerSupportsCancellation { get; set; }         // 调用RunWorkerAsync() 时发生。      public event DoWorkEventHandlerDoWork;      // 调用ReportProgress(System.Int32) 时发生。      public event ProgressChangedEventHandlerProgressChanged;      // 当后台操作已完成、被取消或引发异常时发生。      public event RunWorkerCompletedEventHandlerRunWorkerCompleted;         // 请求取消挂起的后台操作。      public void CancelAsync();      // 引发ProgressChanged事件。percentProgress:范围从 0% 到 100%      public void ReportProgress(int percentProgress);      // userState:传递到RunWorkerAsync(System.Object) 的状态对象。      public void ReportProgress(int percentProgress, object userState);      // 开始执行后台操作。      public void RunWorkerAsync();      // 开始执行后台操作。argument:传递给DoWork事件的DoWorkEventArgs参数。      public void RunWorkerAsync(object argument);  }

2. 相应的EventArgs类

///1)   System.EventArgs基类      // System.EventArgs是包含事件数据的类的基类。      public class EventArgs      {          // 表示没有事件数据的事件。          public static readonly EventArgs Empty;          public EventArgs();      }     ///2)   DoWorkEventArgs类      // 为可取消的事件提供数据。      public class CancelEventArgs : EventArgs      {          public CancelEventArgs();          public CancelEventArgs(bool cancel);          // 获取或设置指示是否应取消事件的值。          public bool Cancel { get; set; }      }      // 为DoWork事件处理程序提供数据。      public class DoWorkEventArgs : CancelEventArgs      {          public DoWorkEventArgs(object argument);             // 获取表示异步操作参数的值。          public object Argument { get; }          // 获取或设置表示异步操作结果的值。          public object Result { get; set; }      }     ///3)   ProgressChangedEventArgs类      // 为ProgressChanged事件提供数据。      public class ProgressChangedEventArgs : EventArgs      {          public ProgressChangedEventArgs(int progressPercentage, object userState);             // 获取异步任务的进度百分比。          public int ProgressPercentage { get; }          // 获取唯一的用户状态。          public object UserState { get; }      }     ///4)   RunWorkerCompletedEventArgs类      // 为MethodNameCompleted事件提供数据。      public class AsyncCompletedEventArgs : EventArgs      {          public AsyncCompletedEventArgs();          public AsyncCompletedEventArgs(Exception error, bool cancelled, object userState);             // 获取一个值,该值指示异步操作是否已被取消。          public bool Cancelled { get; }          // 获取一个值,该值指示异步操作期间发生的错误。          public Exception Error { get; }          // 获取异步任务的唯一标识符。          public object UserState { get; }             // 访问 AsyncCompletedEventArgs 及其派生类的属性前调用此方法          protected void RaiseExceptionIfNecessary()          {              if (this.Error != null)              {                  throw new TargetInvocationException(……);              }              if (this.Cancelled)              {                  throw new InvalidOperationException(……);              }          }      }      public class RunWorkerCompletedEventArgs : AsyncCompletedEventArgs      {          public RunWorkerCompletedEventArgs(object result, Exception error, bool cancelled);             // 获取表示异步操作结果的值。          public object Result { get; }          // 获取表示用户状态的值。          public object UserState { get; }      }

3.   BackgroundWorker示例

示例代码中包含了BackgroundWorker源代码及对应的使用示例,这里不粘贴代码了,会导致篇幅更大。来个示例截图吧:

基于事件的异步编程模式EMP如何理解

示例分析:

1)   首先我们为BackgroundWorker组件注册DoWork(异步操作)、ProgressChanged(进度报告) 和RunWorkCompleted(完成通知)事件;

2)   设置WorkerSupportsCancellation和WorkerReportsProgress属性为true,以声明组件支持取消操作和进度报告;

3)   使用RunWorkerAsync() 开启异步操作,通过IsBusy属性判断是否已经有异步任务在执行;

4)   使用CancelAsync() 方法取消异步操作,但要注意:

a)   它仅仅是将BackgroudWorker.CancellationPending属性设置为true。需要在具体DoWork事件中不断检查BackgroudWorker.CancellationPending来设置DoWorkEventArgs的Cancel属性。

b)   DoWork事件处理程序中的代码有可能在发出取消请求时完成其工作,轮询循环可能会错过设置为 true 的CancellationPending属性。在这种情况下,即使发出了取消请求,RunWorkerCompleted事件处理程序中RunWorkerCompletedEventArgs的 Cancelled 标志也不会设置为 true。这种情况被称作争用状态。(可以通过直接监控组件的CancellationPending属性,来做判断)

5)   确保在DoWork事件处理程序中不操作任何用户界面对象。而应该通过ProgressChanged和RunWorkerCompleted事件与用户界面进行通信。

因为RunWorkerAsync() 是通过委托的BeginInvoke() 引发的DoWork事件,即DoWork事件的执行线程已不是创建控件的线程(我在《异步编程:异步编程模型 (APM)》中介绍了几种夸线程访问控件的方式)。而ProgressChanged和RunWorkerCompleted事件是通过帮助器类AsyncOperation的 Post() 方法使其调用发生在合适的“线程或上下文”中。

自定义基于事件的异步组件

刚才我们介绍了BackgroundWorker组件,但是这个组件在一个时刻只能开启一个异步操作,那如果我们要想同时支持多个异步操作、进度报告、增量结果、取消和返回结果值或异常信息该怎么办呢?对的,我们可以为自己定义一个基于事件的异步组件。

我直接引用MSDN上的一则计算质数的异步组件示例,请从我提供的示例代码中获取。

质数算法:埃拉托色尼筛法

eg:判断n是否为质数

1和0既非素数也非合数;

将2和3加入质数集合primes;从n=5开始,通过 n+=2 来跳过所有偶数;

循环集合primes中的质数并将其做为n的因子,能整除的为合数;

若不能整除,则继续循步骤3直到“因子的平方>n”,即可判断n为质数,并将其加入到集合primes。


 

来个示例截图吧:

基于事件的异步编程模式EMP如何理解

示例分析:(组件名:PrimeNumberCalculator)

   首先我们为PrimeNumberCalculator组件注册ProgressChanged(进度报告) 和CalculatePrimeCompleted(完成通知)事件;

   使用CalculatePrimeAsync(intnumberToTest, object taskId)开启异步任务,注意我们需要传递一个唯一标识Guid taskId = Guid.NewGuid();用于标识取消的操作,并传递给CompletedEventArgs和ProgressChangedEventArgs参数的UserState属性来标识当前引发进度或完成事件的特定异步任务;

   取消操作CancelAsync(object taskId),只是将taskId对应的AsyncOperation实例移除内部任务集合,耗时操作通过判断taskId是否存在于集合来判断其是否被取消;

关于基于事件的异步编程模式EMP如何理解问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: 基于事件的异步编程模式EMP如何理解

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

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

猜你喜欢
  • 基于事件的异步编程模式EMP如何理解
    基于事件的异步编程模式EMP如何理解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。.NET1.0中基于IAsyncResult设计模式的异步编程模型(APM),它使用Sys...
    99+
    2023-06-17
  • .NET2.0版本中基于事件的异步编程模式(EAP)
    一、引言 APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题——不支持对异步操作的取消和没有提供对进度报告的功能,对于有界面的应用程序来说...
    99+
    2024-04-02
  • ASP.NET基于事件的异步模式与异步Action怎么实现
    本篇内容主要讲解“ASP.NET基于事件的异步模式与异步Action怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET基于事件的异步模式与异步Action怎么实现”吧!尽管在A...
    99+
    2023-06-17
  • C#实现基于任务的异步编程模式
    目录一.延续任务二.同步上下文三.使用多个异步方法1.按顺序调用异步方法2.使用组合器四.转换异步模式五.错误处理1.异步方法的异常处理2.多个异步方法的异常处理3.使用Aggreg...
    99+
    2024-04-02
  • Node.js 事件循环中的异步编程模式与反模式
    ...
    99+
    2024-04-02
  • 如何理解CSS编程中的怪异模式
    今天就跟大家聊聊有关如何理解CSS编程中的怪异模式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。怪异模式盒模型今天学习了一下css3的box-siz...
    99+
    2024-04-02
  • 如何理解异步编程的Future
    本篇内容介绍了“如何理解异步编程的Future”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先聊聊线程池的...
    99+
    2024-04-02
  • 基于python yield机制的异步操作同步化编程模型
    本文总结下如何在编写python代码时对异步操作进行同步化模拟,从而提高代码的可读性和可扩展性。 游戏引擎一般都采用分布式框架,通过一定的策略来均衡服务器集群的资源负载,从而保证服务器运算的高并发...
    99+
    2022-06-04
    模型 机制 操作
  • Laravel异步编程:如何利用PHP异步编程处理文件上传?
    Laravel是一个流行的PHP框架,它提供了许多强大的功能和工具,可以帮助开发人员更轻松地构建高质量的Web应用程序。其中一个重要的功能是异步编程。在本文中,我们将探讨如何利用PHP异步编程处理文件上传。 传统的文件上传方式是同步的,这...
    99+
    2023-10-05
    异步编程 文件 laravel
  • C++并发编程:如何实现基于事件驱动的并发模型?
    基于事件驱动的并发模型是 c++++ 中一种流行的并发编程范式,它使用事件循环处理来自不同来源的事件。事件循环是一个无限循环,检索和处理事件队列中的事件,通常通过调用回调函数。在 c++...
    99+
    2024-05-06
    c++ 并发编程
  • 如何理解Java 8异步编程CompletableFuture
    本篇内容介绍了“如何理解Java 8异步编程CompletableFuture”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文大纲速看一、...
    99+
    2023-06-15
  • 如何在 JavaScript 中实现高效的异步编程模式?
    JavaScript 是一门非常流行的编程语言,它的异步编程模式是其最大的特点之一。JavaScript 中的异步编程模式可以帮助我们在处理 I/O 操作和网络请求时提高程序的性能。本文将介绍如何在 JavaScript 中实现高效的异步编...
    99+
    2023-10-02
    异步编程 javascript linux
  • Laravel文件异步编程:如何通过PHP异步编程提高文件处理效率?
    Laravel是一款流行的PHP框架,它提供了许多有用的功能,其中包括文件处理。但是,处理大型文件时,传统的同步文件处理方式可能会导致性能问题。为了解决这个问题,我们可以使用异步编程来提高文件处理效率。在本文中,我们将学习如何使用Larav...
    99+
    2023-10-05
    异步编程 文件 laravel
  • 怎么理解多核编程中的条件同步模式
    本篇内容介绍了“怎么理解多核编程中的条件同步模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在多线程编程...
    99+
    2024-04-02
  • Nodejs中如何理解异步I/O和事件循环
    这期内容当中小编将会给大家带来有关Nodejs中如何理解异步I/O和事件循环,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。异步I/O概念处理器访问任何寄存器和 Cache...
    99+
    2024-04-02
  • Node.js 事件处理器的技巧:优化异步编程的性能
    1. 使用事件循环 Node.js 利用事件循环来处理异步操作。合理利用事件循环可以提高应用程序的响应性。一种常见的技术是将阻塞代码移至事件循环之外,例如使用 setTimeout() 或 process.nextTick() 延迟函数...
    99+
    2024-03-05
    Node.js、异步编程、事件处理器、性能优化
  • 如何实现观察者模式及Spring中的事件编程模型
    这篇“如何实现观察者模式及Spring中的事件编程模型”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来...
    99+
    2024-04-02
  • C++并发编程:如何实现高效的异步编程模型?
    异步编程提高了响应能力,在 c++++ 中可通过以下方式实现:协程:轻量级协作任务,使用协程库(如 folly)创建和管理。future:表示异步操作结果,使用 future 库(如 s...
    99+
    2024-05-01
    c++ 并发编程
  • 如何理解JS的同步异步编程和EventLoop底层机制
    这篇文章主要讲解了“如何理解JS的同步异步编程和EventLoop底层机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解JS的同步异步编程和Even...
    99+
    2024-04-02
  • GO语言的异步编程模型:如何优雅地处理文件和日志?
    随着互联网的发展,异步编程模型在软件开发中变得越来越常见。GO语言作为一种高效的编程语言,也具备了异步编程的能力。在这篇文章中,我们将探讨GO语言的异步编程模型,并展示如何使用它来优雅地处理文件和日志。 一、GO语言的异步编程模型 在传统...
    99+
    2023-09-27
    异步编程 文件 日志
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作