我正在使用c#应用程序并使用一些异步调用。我必须使用来自给定供应商的SDK来集成到供应商平台。看起来像SDK async方法基于pre 5.0 C#并使用APM模型而不是TPM(我的大部分异步工作都是使用TPM和await命令)。
我找到了FromAsync方法将APM异步方法包装到TPM中但是很难用它(希望我在正确的道路上)。
有问题的异步方法称为“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中的第一个参数是begin函数,第二个参数是end / complete函数。如果我正确理解APM异步模型和这个SDK,我会假设CommitAsync是begin函数,然后它的回调会结束函数吗?
答案 0 :(得分:1)
−1
专门用于将APM-style asynchronicity转换为TAP-style asynchronicity。因此,这里不合适。
对于将异步发生的事物转换为TAP样式的更通用的方法,使用TaskCompletionSource<T>
来执行更多&#34;手册&#34;转换。大概,它会是这样的:
Task.FromAsync
就个人而言,我发现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
更容易理解。
答案 1 :(得分:0)
不,CommitAsync
根本不遵循APM,因为它没有提供FromAsync
所期望的内容。您可以在FromAsync.