当前位置: 首页 > 知识库问答 >
问题:

编写设计良好的异步/非异步API

钱志
2023-03-14

我正面临着一个问题,即设计能够执行网络I/O的方法(用于可重用库)。我读过这个问题

API设计中C#5Await/Async模式

以及其他与我的问题更接近的问题。

所以,问题是,如果我想同时提供异步和非异步方法,我必须如何设计这些?

例如,要公开方法的非异步版本,我需要执行如下操作

public void DoSomething() {
  DoSomethingAsync(CancellationToken.None).Wait();
}

我觉得这不是个好设计。我想要一个关于如何定义私有方法的建议(例如),这些私有方法可以包装在公共方法中以提供两个版本。

共有1个答案

梁季
2023-03-14

如果您想要最易维护的选项,那么只提供一个asyncAPI,它在不进行任何阻塞调用或使用任何线程池线程的情况下实现。

如果您确实希望同时拥有async和同步API,那么您将遇到可维护性问题。您确实需要实现两次:一次async和一次synchronous。这两个方法看起来几乎完全相同,所以初始实现很容易,但是最终会得到两个几乎完全相同的方法,所以维护是有问题的。

特别是,没有一种好的简单的方法只制作async或同步“包装器”。Stephen Toub有关于这个主题的最佳信息:

  1. 是否应该公开同步方法的异步包装?
  2. 是否应该公开异步方法的同步包装?

(两个问题的简短答案都是“否”)

 类似资料:
  • 异步文件读写 读文件 use AsyncFile; $content = (yield AsyncFile::read(__ROOT__."runtime/test.txt")); 写文件 $res = (yield AsyncFile::write(__ROOT__."runtime/test.txt", "hello wordls!")); $res = (yi

  • MXNet使用异步计算来提升计算性能。理解它的工作原理既有助于开发更高效的程序,又有助于在内存资源有限的情况下主动降低计算性能从而减小内存开销。我们先导入本节中实验需要的包或模块。 from mxnet import autograd, gluon, nd from mxnet.gluon import loss as gloss, nn import os import subproces

  • 介绍 Javascript 是一个单线程的编程语言,单线程的特点就是一次只能处理一件事情,当前代码任务耗时执行会阻塞后续代码的执行。异步编程则是一种事件驱动编程,请求调用函数或方法后,无需立即等待响应,可以继续执行其他任务,而之前任务响应返回后可以通过状态、通知和回调来通知调用者。 异步编程方法 js 中的异步编程方法有回调函数、事件处理函数、观察者、Promise、Generator、async

  • NodeJS最大的卖点——事件机制和异步IO,对开发者并不是透明的。开发者需要按异步方式编写代码才用得上这个卖点,而这一点也遭到了一些 NodeJS反对者的抨击。但不管怎样,异步编程确实是NodeJS最大的特点,没有掌握异步编程就不能说是真正学会了NodeJS。本章将介绍与异步编 程相关的各种知识。 回调 在代码中,异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异

  • 目前为止,我们在做的都是同步编程。同步编程执行过程很简单:一个程序从第一行开始,逐行执行一直到末尾。每次调用一个函数时,程序就会等待这个函数返回然后在执行下一行。 在异步编程中,函数地执行通常是非阻塞的。换句话说,每次你调用一个函数它就会立即返回,但相对得,这就表示函数并不会立即被执行。它有了一种机制(名为 调度程序),让可以随时在未来执行这些函数。 使用异步编程会导致程序在任何异步函数开始之前就

  • 问题内容: 我是节点的新手,并尝试在节点中使用异步和事件行为优势。我以前从节点上了解到,用事件对象处理的所有内容都会异步执行。 然后我尝试了这个,请考虑以下代码: 这是异步执行吗?我认为不!为什么,因为我读了很多这句话: 一个事件被触发了,所以去做点什么,然后当你完成它之后,回来告诉我,但是与此同时,我会做点其他的事情。 就像快餐店的场景。但是上面的代码,当事件工作被触发时,将发生以下顺序: 进入