在 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>
在 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>