gpt4 book ai didi

c# - 使用 Task 包装 native 异步函数

转载 作者:行者123 更新时间:2023-11-30 13:16:55 25 4
gpt4 key购买 nike

我正在尝试围绕用 native 代码编写的第三方库编写一个 c# 包装器,以便在我们的应用程序中使用,这些应用程序几乎完全是用 .NET 编写的,并且我试图保持对 C# 模式的忠实。该库中的几乎所有调用本质上都是异步的,将所有异步调用包装到 Task 对象中似乎是合适的。下面是 native 库的结构的过度简化示例:

delegate void MyCallback(string outputData);

class MyNativeLibrary
{
public int RegisterCallback(MyCallback callback); // returns -1 on error
public int RequestData(string inputData); // returns -1 on error
}

现在,我已经通过事件订阅提供了我的返回值,但我相信这是返回我的数据的更好方式:

class WrapperAroundNativeCode
{
public async Task<string> RequestData(string inputData);
}

到目前为止,我一直未能找到合适的方法来实现这一点,我正在联系在使用 Task 对象和 async/await 模式方面比我更有经验的人。

最佳答案

您将使用 TaskCompletionSource<TResult> 为了这。类似于以下代码:

class WrapperAroundNativeCode
{
public async Task<string> RequestData(string inputData)
{
var completionSource = new TaskCompletionSource<string>();
var result = Native.RegisterCallback(s => completionSource.SetResult(s));
if(result == -1)
{
completionSource.SetException(new SomeException("Failed to set callback"));
return completionSource.Task;
}

result = Native.RequestData(inputData);
if(result == -1)
completionSource.SetException(new SomeException("Failed to request data"));
return completionSource.Task;
}
}

此答案假定不会同时调用此方法。如果有,您将需要一些方法来区分不同的调用。许多 API 提供了一个 userData您可以为每次调用设置一个唯一值的有效负载,以便您可以区分。

关于c# - 使用 Task<T> 包装 native 异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19496228/

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