在 MPS 中执行非 ui 阻塞任务并在任务完成后更改模型

Executing a non ui blocking task in MPS and changing the model after task completion

Jetbrains MPS 中,我想在用户点击快捷方式或上下文菜单中的操作时执行 Web 请求。

成功执行此请求后,我想通过操纵 MPS 模型向用户显示响应。

当我在 UI 线程中执行 Web 请求时,ui 将被阻塞,直到我收到响应或请求超时。

这会导致糟糕的用户体验。

如何异步执行请求?

Web 请求必须在单独的线程中执行 - afaik MPS 没有对 ForkJoinPools 的完整 JDK8 支持;我在这个例子中使用了老式的方法。

此外,您需要引用 ModelAccess 才能更改 MPS 模型。 模型更改代码必须在 UI 线程中执行。

SwinUtilities.invokeAndWait用于在UI线程内执行代码,modelAccess.executeCommand包装模型更改代码。

this.asyncUpdate是概念的属性,由概念编辑器显示。

正在执行的任务:

<iframe src='https://gfycat.com/ifr/DisfiguredAdeptAmericanbittern' frameborder='0' scrolling='no' allowfullscreen width='640' height='213'></iframe><p> <a href="https://gfycat.com/disfiguredadeptamericanbittern-mps">via Gfycat</a></p>