gpt4 book ai didi

.net - 提供异步编程模型 : Should I?,如果是,应该是 VerbAsync() 还是 BeginVerb()?

转载 作者:行者123 更新时间:2023-12-04 17:42:08 26 4
gpt4 key购买 nike

Providing Synchronous and Asynchronous versions of Method in c#询问如何提供方法的异步版本。

答案之一表明类库开发人员应尽可能避免提供基于 single responsibility principle 的异步方法。 .

  • 这是真的?
    我不应该提供方法的异步版本吗?
  • 如果答案是 (换句话说, DO 提供异步版本的方法),那么我应该遵循 this MSDN article 中的建议吗? ,其中指出:

  • The IAsyncResult design pattern allows for a variety of programming models, but is more complex to learn and provides a flexibility that most applications do not require. Where possible, class library designers should implement asynchronous methods using the event-driven model. In some cases the library designer should also implement the IAsyncResult based model.



    ??

    “事件驱动模型”是这样一种,如果方法的同步版本是 Verb(),则方法的异步版本是 VerbAsync(),并且存在 VerbCompleted 事件。
    IAsyncResult 模式是众所周知的 BeginVerb() 和 EndVerb() 方法。

    最佳答案

    为什么要考虑提供异步 API?

    API 操作是受 IO 限制还是受 CPU 限制? (是因为等待 IO 完成需要很长时间,还是只是 CPU 密集型?)

    如果 CPU 受限,我会考虑是否真的有必要提供异步版本,因为调用者总是可以通过线程池有效地将同步操作转换为异步操作。

    提供异步 API 的最重要原因是针对 IO 绑定(bind)的操作。与其让线程等待高延迟 IO 操作,不如使用异步 IO。这尤其会影响系统的可扩展性。例如,如果您有一个服务器阻塞单个同步 IO 操作,这不是什么大问题 - 您只是占用了一个线程。但是,同时执行 1000 个相同的操作,您将占用 1000 个线程(如果内存为每个线程提供 1MB 的堆栈)只是为了等待需要几个 CPU 周期的操作完成。最终结果 - 你有一个空闲的 CPU,但正在消耗资源。

    因此,例如,如果您自己正在编写一个套接字库,那么您肯定会希望提供异步 IO 操作,以便该库的用户可以编写可扩展的应用程序。

    例如,如果您正在编写一个加密库,那么即使操作可能需要很长时间,也可能没有迫切需要提供异步 API - 无论如何它是 CPU 绑定(bind)的。如前所述,用户可以使其异步。

    最后,如果您正在编写一个 IO 绑定(bind)系统,该系统使用提供异步 IO 的较低级别的 API(例如,使用套接字类的 FTP 客户端),您可能还需要考虑提供 API 的异步版本。事情是虽然这样做并不容易 - 如果您使用较低级别的 API 的异步函数,您只能提供可伸缩性优势。这会很快将简单的同步逻辑变成极其复杂、难以调试的异步逻辑。主要问题是您之前可以通过局部变量轻松访问的所有状态信息最终需要手动捕获,以便在下一个 IO 操作完成时您的逻辑知道下一步该做什么。

    提供一个异步 API,然后在内部调用同步 IO 操作是毫无意义的(尽管我已经看到它完成了)。给人一种可扩展性的错觉,但是……不是!

    当 .NET 4.0 出现时,其中一些可能会变得更简单(尽管我认为从我所看到的情况来看它仍然会很棘手)。

    同时,您可能想查看 Jeffrey Richter 的异步枚举器库,它可以帮助简化这一点(在某种程度上):

    Jeffrey Richter on his async enumerator

    Power threading library including async enumerator

    希望这可以帮助,
    菲尔。

    注意:如果您要实现异步 API,我建议通过“经典开始/结束”IAsyncResult API 提供它。原因是,据我记得,它应该与 .NET 4.0 的任务并行库更好地集成。

    关于.net - 提供异步编程模型 : Should I?,如果是,应该是 VerbAsync() 还是 BeginVerb()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1376353/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com