首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步方法可以从同步代码异步运行吗?

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

Stack Overflow用户
提问于 2015-02-19 03:24:45
回答 2查看 418关注 0票数 2

是否可以调用异步方法,以便从同步的方法异步运行?我不关心它挂起同步调用方,直到它返回,但希望异步调用该方法。

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

为了提供更多细节:

使用Activator.CreateInstance.创建接口的实例。这个接口有两个公共的异步方法。这个界面的一个实现会启动一个GUI,这样测试人员就可以手动指定方法的返回值。如果它被异步调用,它就能正常工作。但是,如果不异步调用它,GUI就会冻结。我认为这是因为GUI背后的异步功能不再起作用了。

我有一些代码调用同步运行的方法。是否可以调用该方法,以便从此代码异步运行其内部调用?我尝试创建第二个线程来调用异步方法(可能是错误的),但仍然冻结了GUI。我认为不异步运行的原因是,如果更改异步运行的代码以调用方法而不使用等待,则显示的问题与从同步运行的代码调用方法的问题相同。

EN

回答 2

Stack Overflow用户

发布于 2015-02-19 03:44:40

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

因此,您的主线程(即应用程序用户界面线程)正在调用您的接口方法,然后要显示一个窗口。如果调用方法直到接口方法完成后才返回,那么它将冻结,直到方法返回时,消息循环才能旋转。

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-02-23 17:42:07

返回空,并触发事件

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

在从VB6到C#的过程中,我最初忽略了这一点。但事实证明,这就是相对容易实现。如果由于某种原因,事件不在画面中,您可能会在拥有异步方法的对象上轮询一个结果属性,直到它被设置为止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28598121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档