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

如何在C#中将同步函数包装为异步函数?[副本]

程项禹
2023-03-14

我正在使用无法修改的同步第三个功能,例如:

public void startDoSth(Action<string> onDone)

生成一个新的线程来完成这项工作,并立即返回,当事情完成时,我的onDone函数将被调用。

我想写一个异步方法来包装,这样有人可以这样调用它:

await doSthAsync()
onDone()

doSthasync()中,我调用starDoSth()来做真正的事情。但是我不知道如何编写doSthAsync()

有人能告诉我这是否可能,以及怎么做吗?谢谢。

共有1个答案

东方涛
2023-03-14

您可以使用TaskCompletionSource将其转换为TAP:

Task<string> DoSthAsync()
{
    var tcs = new TaskCompletionSource<string>();
    startDoSth(tcs.SetResult);
    return tcs.Task;
}

SetResult完成返回的Task(并设置结果),因此可以将其作为回调函数传递。

 类似资料:
  • 问题内容: 假设您维护一个公开一个函数的库。您的用户调用它来获取实际数据: 数据被保存在文件中,因此您可以使用内置的Node.js来实现。很明显这两个和是同步的功能。有一天,您被告知将基础数据源切换到只能异步访问的仓库(例如MongoDB)。还被告知要避免惹恼您的用户,API不能更改为仅返回promise或要求回调参数。您如何满足这两个要求? 使用回调/承诺的异步功能是JavasSript和Nod

  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调

  • 我在一个函数中有这样的代码块: 它获取一些数据,然后对数据运行验证()。 但是,我对数据的验证实际上也是异步的,因为它是根据一个json模式来验证数据的,而json模式位于一个独立的json文件中,所以它必须首先读取该文件。 我使用了一个承诺来读取文件内容,然后进行验证: 如何编辑此问题中的顶部代码块以解释if语句()中的异步函数?

  • 我正试图从两个异步函数向一个函数传递两个值,但我不确定如何继续。代码如下: 我知道问题是我在异步函数之外调用函数,所以它不接收数字,它给我一个NAN(不是数字),但我不知道如何正确传递这两个在不同函数中检索的参数,有没有可能将btcPriceInUSD和priceExchangeMXN合并在一起并从那里调用它? 提前道谢!

  • 我有以下问题:我试图从函数调用闭包,但是以后必须调用另一个函数。 我无法创建异步闭包,因为它们目前不稳定: 所以我得以某种方式这样做。 我发现了几个与该问题相关的问题,例如,但是当我试图实现它时,我收到了以下错误: 这里是游乐场链接,希望能显示我有什么问题。 我正在使用标题中所述的tokio。

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做