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

C# 异步方法可以从同步代码异步运行吗,c#,asynchronous,synchronous,C#,Asynchronous,Synchronous,是否可以调用async方法,使其从同步方法异步运行?我不关心它在返回之前挂起同步调用程序,而是希望异步调用该方法 我不是问同步代码一般是否可以调用async方法。我知道它可以,但它将同步运行async方法(以及其中调用的每个async方法),这是我试图避免的情况 详情如下: 使用Activator.CreateInstance创建接口实例。此接口有两个公共异步方法。此接口的一个实现启动GUI,以便测试人员可以手动指定方法的返回值。如果异步调用它,它就可以正常工作。但是,如果不异步调用,GUI将冻

是否可以调用async方法,使其从同步方法异步运行?我不关心它在返回之前挂起同步调用程序,而是希望异步调用该方法

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

详情如下:

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


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

为了让用户界面窗口显示和操作它,需要使用创建窗口以处理windows消息。如果没有消息循环,窗口将冻结并拒绝操作

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

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


拥有多个用户界面线程不是很常见,但这是可以做到的。

返回void并触发事件

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


我最初在从VB6到C#的过程中忽略了这一点。但事实证明是这样的。如果由于某些原因事件不在考虑范围内,您可能会轮询拥有异步方法的对象的results属性,直到它被设置。

这一点是错误的:“我不是问同步代码是否可以调用异步方法。我知道它可以,但它会同步运行异步方法(以及在其中调用的每个异步方法),这是我试图避免的情况。“如果您只调用一个异步方法,它将异步运行(前提是它实现正确)。我想我在MSDN上读到了,但现在找不到。这个问题的措辞是否更恰当“我可以从未标记为async的方法调用带有wait的async方法吗"?当您使用
wait
从同步方法等待
async
方法完成时,就会发生这种情况。这只是使该方法成为异步方法,并简单地使用基于事件的异步模型,而不是基于
任务的异步模型。还可以使用基于回调的异步模型odel,以及其他使操作异步的可能方法。