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

GUI异步调用事件

阮雅达
2023-03-14

我有一个UserControl上的事件,我正在听:

public void OnSomething(SomeEventArgs args){
    SomeResult result = ?await? _businessObject.AsyncCall();
    ApplySomethingOnTheGuiBasedOnTheResult(result);
}

_businessObject。AsyncCall()具有以下签名:

public async Task<SomeResult> AsyncCall();

在以下情况下,如何调用此异步方法:

  1. 不阻塞GUI线程
  2. 在调用我的异步方法后能够调用ApplyThingOnTheGuBasedOnTheResult
  3. 能够在正确的(GUI)线程中调用ApplyThingOnTheGuBasedOnTheResult

我所尝试的:

public void OnSomething(SomeEventArgs args){
    SomeResult result = await _businessObject.AsyncCall();
    ApplySomethingOnTheGuiBasedOnTheResult(result);
}

--

public void OnSomething(SomeEventArgs args){
    SomeResult result = _businessObject.AsyncCall().Result;
    ApplySomethingOnTheGuiBasedOnTheResult(result);
}

--

public void OnSomething(SomeEventArgs args){
    _businessObject.AsyncCall().ContinueWith(t=>{
        if(InvokeRequired){
            Invoke(new Action(()=>ApplySomethingOnTheGuiBasedOnTheResult(t.Result)));
        }
    });
}

--

共有1个答案

支劲
2023-03-14

您只需将处理程序标记为异步:

public async void OnSomething(SomeEventArgs args)
{
    SomeResult result = await _businessObject.AsyncCall();
    ApplySomethingOnTheGuiBasedOnTheResult(result);
}

我知道不建议使用asyc和返回类型val(通常应该是TaskTask

这样,控制流就会在wait语句中返回给调用者。当异步调用完成后,在UI线程上等待后,最终会继续执行。

 类似资料:
  • 问题内容: TL; DR我正在寻找一种让一个线程在另一个线程中引发事件的方法 编辑: 我说“立即”一词,正如一些评论家指出的那样,这是不可能的。我的意思是,如果gui线程处于空闲状态,则应该在毫秒到十亿分之一秒的范围内相当快地发生(这应该是正确的,如果我做对的话)。 案例示例: 我有一个具有Parent类的项目。该Parent类创建一个子线程“ Gui”,该子线程包含一个javafx应用程序并实现

  • 本文向大家介绍JavaScript 异步调用,包括了JavaScript 异步调用的使用技巧和注意事项,需要的朋友参考一下 问题 可修改下面的 aa() 函数,目的是在一抄后用 console.log() 输出 want-value 但是,有额外要求: aa() 函数可以随意修改,但是不能有 console.log() 执行 console.log() 语句里不能有 setTimeout 包裹 解

  • Provider端异步执行将阻塞的业务从Dubbo内部线程池切换到业务自定义线程,避免Dubbo线程池的过度占用,有助于避免不同服务间的互相影响。异步执行无益于节省资源或提升RPC响应性能,因为如果业务执行需要阻塞,则始终还是要有线程来负责执行。 注意:Provider端异步执行和Consumer端异步调用是相互独立的,你可以任意正交组合两端配置 Consumer同步 - Provider同步 C

  • 从v2.7.0开始,Dubbo的所有异步编程接口开始以CompletableFuture为基础 基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。 使用CompletableFuture签名的接口 需要服务提供者事先定义CompletableFuture签名的服务,具体参见服务端异步执行接口定义: public interface Asyn

  • 同步调用异步方法最安全的方法是什么?

  • 我想设置一个vue.js组件的数据与按钮模板和@单击事件。此事件调用一个方法组件,该组件调用带有promise的异步函数。 当我单击我的按钮时,段落标记html的结果正确显示,但同时它在我的检查器浏览器中生成了一个错误,如下所示: vue.runtime.esm.js:620[vue warn]:v-on处理程序中的错误:“TypeError:foo.then(…).bind不是函数” 在 ---