gpt4 book ai didi

c# - 异步和 FromAsync

转载 作者:太空宇宙 更新时间:2023-11-03 12:30:55 27 4
gpt4 key购买 nike

我正在开发一个 C# 应用程序并使用一些异步调用。我必须使用给定供应商的 SDK 才能集成到供应商平台中。看起来 SDK 异步方法基于 5.0 之前的 C# 并使用 APM 模型而不是 TPM(我的大部分异步工作都是使用 TPM 和 await 命令)。

我找到了将 APM 异步方法包装到 TPM 中的 FromAsync 方法,但遇到了困难(希望我走在正确的道路上)。

有问题的异步方法称为“CommitAsync”,它来自供应商 SDK。当我将鼠标悬停在 VS 中的方法上时,它会输出:

EditableListConfigurationObject<UserConfiguration.Property>.CommitAsync(System.ComponentMode.AsyncCompletedEventHandler completedCallback, object userState)

所以我正在尝试转换为 TPM 并且到目前为止有这个(这是抛出错误):

var x = Task.Factory.FromAsync(userConfigurationObject.CommitAsync, UserCreated);

UserCreated 是我的回调函数

private void UserCreated(Object sender, SystemComponentMode.AsyncCompletedEventArgs args) 
{}

当我将鼠标悬停在“FromAsync 方法中的 userConfigurationOBject.CommitAsync”上时,它显示“无法从方法组转换为 IAsyncResult”

据我了解,FromAsync 中的第一个参数是开始函数,第二个参数是结束/完成函数。如果我正确理解 APM 异步模型和此 SDK,我会假设 CommitAsync 是开始函数,然后它的回调将是结束函数?

最佳答案

Task.FromAsync专门设计用于转换 APM-style asynchronicity进入TAP-style asynchronicity .因此,放在这里是不合适的。

有关将异步发生的内容转换为 TAP 样式的更通用方法,请使用 TaskCompletionSource<T> 做一个更“手动”的转换。大概,它会是这样的:

TaskCompletionSource<SystemComponentMode.AsyncCompletedEventArgs> tcs = 
new TaskCompletionSource<SystemComponentMode.AsyncCompletedEventArgs>();

EditableListConfigurationObject<UserConfiguration.Property>
.CommitAsync((sender,args) => {
tcs.SetResult(args); //or perhaps tcs.SetException in some cases?
}, object userState);

var resultArgs = await tcs.Task;

就我个人而言,我发现 Task.FromAsync对它的所有重载都非常讨厌。使用 TaskCompletionSource更容易理解。

关于c# - 异步和 FromAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42837856/

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