UML 序列图中的异步回复(async/await 模式)

Asynchronous replies in UML sequence diagrams (async/await pattern)

提问人:Christophe 提问时间:7/1/2023 最后编辑:Christophe 更新时间:7/11/2023 访问量:405

问:

许多现代语言都提倡异步调用,并在真正需要时等待结果。示例:在 C#Swift 中为 / 或在 C++ 中为 /。以以下假设的实现为例:asyncawaitpromisefuture

class X { 
  private Y y; 
  public async void doSomething() {
    var someTask = y.doSomeAsyncOp();// Asynchronous call 
    doSomethingImmediately();        // Potentially in parallel with async behavior
    var result = await someTask;     // Getting or waiting for result of async call
  }
  ...
}

这在设计中实现了异步调用的回复意图:

sequence diagram with async call and async reply

不幸的是,根据 UML 2.5.1,回复消息似乎只用于同步调用,而异步调用不应该有回复。请参阅第 17.4.3 节:

如果 messageSort 为 reply,则 Message 表示对 Operation 的同步调用的返回值。Message 的参数对应于操作 (...) 的 out、inout 和 return ownedParameters。

规范的第 13 节定义了同步和异步行为,这与这种理解是一致的。那么,如何使用合法的UML对设计进行建模呢?

  • 相反方向的异步消息:如果有一些回调操作,效果会很好。但是在没有回调的情况下,消息的签名是什么?

  • 使用第二次同步调用来建模,直到 的执行规范结束。优点:它实现了同步。但是消息签名是什么?awaity

  • 中间生命线不是一个相关的解决方案:非常详细的实现级别的UML图将比代码更难理解。而且它不能很好地传达设计意图。Task

异步 语言律师 UML 序列图

评论

0赞 qwerty_so 7/1/2023
回复可以是 (a) 同步消息,只需说出即可。
0赞 Christophe 7/2/2023
@qwerty_so是的,但是如果我有几个不同的异步,并且我需要能够确定消息返回的意思是哪一个(例如,请参阅问题中的快速链接并使用“async let”搜索示例)?我的意思是对于回复,有一个符号可以消除歧义。你如何回复消息(除了以明文形式标记箭头)
0赞 qwerty_so 7/2/2023
嗯,就是这样。来回之间的注释链接。实际上,返回出现在子句中。所以你有一些外部信息。你可以打电话给这个消息,不是吗?awaitawait
1赞 qwerty_so 7/5/2023
你可能会开始赏金。但是没有其他回应的事实让我认为只有盲人乘客才会跳上去:-/

答:

1赞 Axel Scheithauer 7/11/2023 #1

即使 async/await 模式用于异步通信,对操作的调用和 都有返回值,发送方必须等待它们。因此,我建议使用同步调用。await

example sequence diagram

两条消息之间的连接是第一个操作的赋值目标,用作 的参数。someTaskawait