可以从同步代码异步运行异步方法

时间:2015-02-19 03:24:46

标签: c# asynchronous synchronous

是否可以调用 async 方法,使其从同步方法异步运行?我不关心它挂起同步调用者直到它返回,但是想要异步调用该方法。

我不是在询问同步代码是否可以调用 async 方法。我知道它可以,但它将同步运行异步方法(以及在其中调用的每个异步方法),这是我尝试的情况避免。

提供更多详情:

使用 Activator.CreateInstance 创建接口实例。此界面有几个公共异步方法。此接口的一个实现启动GUI,以便测试人员可以手动指定方法的返回值。如果异步调用它可以正常工作。但是,如果不是异步调用,则GUI会冻结。我相信这种情况正在发生,因为GUI背后的异步功能不再有效。

我有一些代码调用同步运行的方法。是否可以调用该方法以使其内部调用从此代码异步运行?我尝试创建第二个线程来调用异步方法(可能不正确)并且仍然冻结了GUI。我认为不是异步运行的原因是关键问题是如果我更改 异步运行的代码以调用方法而不使用等待它会出现与我调用时相同的问题它来自同步运行的代码。

2 个答案:

答案 0 :(得分:2)

为了显示和操作您的用户界面窗口,需要创建窗口的线程来处理Windows消息。如果没有消息循环旋转,窗口将冻结并拒绝操作。

因此,您的主线程(应用程序用户界面线程)正在调用您想要显示窗口的接口方法。如果调用方法在接口方法完成之前没有返回,那么它将冻结,消息循环无法旋转,直到您的方法返回。

您唯一的解决方案是让接口实现使用单独的线程来显示窗口,而其他线程将需要自己的消息循环来允许窗口运行。

拥有多个用户界面线程并不常见,但可以这样做。

答案 1 :(得分:1)

返回无效,并触发事件

async 方法可以声明为返回 void 。这将允许不知道任务类的代码调用它。虽然您无法直接从方法本身返回结果,但可以在结果准备好时触发事件。只需向调用该方法的代码添加一个事件处理程序,就可以获得结果。

我原本忽略了这一点,因为我要从VB6转到C#。但事实证明这是relatively easy to implement。如果由于某种原因事件不在图片中,您可能会在拥有 async 方法的对象上轮询结果属性,直到设置为止。

相关问题