gpt4 book ai didi

.net - 如何用回调包装 3rdParty 函数以便能够等待回调完成然后从回调函数返回结果?

转载 作者:行者123 更新时间:2023-12-03 18:11:16 30 4
gpt4 key购买 nike

我想将第 3 方函数包装到 Task 中,以便能够等待完成回调函数。这是我想要实现的目标:

public MyClass MyProperty { 
get
{
if (myProperty == null)
myProperty = LoadMyValue("1234");
return myProperty ;
}
set
{
myProperty = value;
}
}

public MyClass LoadMyValue(string id) {
return MyClassTools.LoadMyValue(id);
}

在 MyClassTools 中

static public MyClass LoadMyValue(string id) {
3rdPartyApi.Call(id, Callback);
// here I want to return Callback result
}

static MyClass Callback(3rdPartyResult result) {
return new MyClass(result);
}

如何在这里使用 Tasks 和 async/await 来直接从函数 LoadMyValue 返回回调结果?

最佳答案

按照 Noseratio 的建议,您可以使用 TaskCompletionSource<T>包装异步 API:

public static Task<3rdPartyResult> CallAsync(string id)
{
var tcs = new TaskCompletionSource<3rdPartyResult>();
3rdPartyApi.Call(id, result =>
{
if (result.Exception == null) // or whatever
tcs.TrySetResult(result);
else
tcs.TrySetException(result.Exception);
});
return tcs.Task;
}

然后你可以制作LoadMyValue异步方法:

static public async Task<MyClass> LoadMyValueAsync(string id)
{
return new MyClass(await CallAsync(id));
}

但是,这不会帮助您返回属性的值。属性不能是异步的。在您的情况下,您似乎想要一个“异步惰性”类型的值,您可以这样做:

private readonly Lazy<Task<MyClass>> myProperty =
new Lazy<Task<MyClass>>(() => LoadMyValueAsync("1234");
public Lazy<Task<MyClass>> MyProperty
{
get { return myProperty; }
}

请注意,我删除了 setter,因为语义对于异步延迟计算的属性没有意义。

然后您可以像这样使用该属性:

MyClass value = await MyProperty.Value;

有一些类型可以使代码稍微简单一些。例如,Noseratio's type for callback wrapping ,或 Stephen Toub 的 AsyncLazy<T> (这也是我的 AsyncEx library 的一部分)。

关于.net - 如何用回调包装 3rdParty 函数以便能够等待回调完成然后从回调函数返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23008269/

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