gpt4 book ai didi

C# Async 当还需要支持同步调用时

转载 作者:行者123 更新时间:2023-12-03 18:34:17 25 4
gpt4 key购买 nike

我的情况是,我们有一些由用户输入(按钮单击)运行的代码,这些代码通过一系列函数调用运行并导致生成一些数据(这是一个非常繁重的操作,需要几分钟)。我们想为此使用异步,以便在我们执行此操作时它不会锁定 UI。

但同时我们也有一个要求,即这些函数也可以通过一个最好是同步的 API 来使用。

可视化/示例(伪代码):

public async void Button_Click() // from UI context
{
await instanceOfClassA.FuncA();

// some code
}

public async Task ClassA.FuncA()
{
await instanceOfClassB.FuncB()

// some code
}

public async Task ClassB.FuncB()
{
await instanceOfClassC.SomeHeavyFunc()

// some code
}

public async Task ClassC.SomeHeavyFunc()
{
// some heavy calculations
}


// Also need to provide a public synchronous API function
public void SomeClass.SynchronousAPIFunc()
{
// need to call differentInstanceOfClassB.FuncB()
}

有没有办法让公共(public) API 函数在内部等待异步操作?

编辑:
在这个 post ,用户 Rachel 提供了两个问题的答案。两者似乎都很有趣,尽管我不确定哪一个会提供最少的风险/副作用。

编辑2:
我应该注意到我们使用的是 .NET v4.6.1。

提前致谢。

最佳答案

制作只调用异步版本的方法的“同步”版本的问题是 it can cause deadlocks ,特别是如果调用此代码的人不知道这是正在发生的事情。

如果你真的想制作同步版本,那就跟随微软的脚步,编写不使用任何异步代码的全新方法。例如, File.ReadAllLines() 的实现不使用任何与 File.ReadAllLinesAsync() 相同的代码.

如果您不想这样做,那么就不要提供方法的同步版本。让调用者决定如何处理它。如果他们想在上面同步阻塞,那么他们可以减轻死锁的风险。

关于C# Async 当还需要支持同步调用时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62283669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com