gpt4 book ai didi

c# - 使用服务引用时无法将 IAsyncResult 转换为 AsyncResult

转载 作者:行者123 更新时间:2023-11-30 21:22:02 25 4
gpt4 key购买 nike

我有一个正在运行的 WCF 服务,我在解决方案资源管理器中使用添加服务引用添加了对该服务的引用,并选中了创建异步操作的框。

我的调用工作正常,我有一个双向 channel 从服务器报告一些事件,我正在接收这些事件。但是,当异步任务在我的回调处理程序中完成时,我收到错误 Unable to cast object of type 'SendAsyncResult' to type 'System.Runtime.Remoting.Messaging.AsyncResult'。

调用方法的代码。

DatabaseManagement.DatabaseManagementClient d = new DatabaseManagement.DatabaseManagementClient(new InstanceContext(new DatabaseManagementCallback()));
d.Open();
d.BeginCreateDatabase("", "PreConfSA", "_test", new AsyncCallback(BeginCreateDatabaseCallback), null);

异步回调

static void BeginCreateDatabaseCallback(IAsyncResult ar)
{
AsyncResult result = (AsyncResult)ar; //Execption happens here
DatabaseManagement.DatabaseManagementClient caller = (DatabaseManagement.DatabaseManagementClient)result.AsyncDelegate;
Console.WriteLine(caller.EndCreateDatabase(ar));
DatabaseManagement.AccountInfo ai = new DatabaseManagement.AccountInfo();
//set up ai here
Console.WriteLine(caller.UpdateInfo("", "_test", ai));
}

异常详细信息

System.InvalidCastException was unhandled by user code
Message=Unable to cast object of type 'SendAsyncResult' to type 'System.Runtime.Remoting.Messaging.AsyncResult'.
Source=Sandbox Console
StackTrace:
at Sandbox_Console.Program.BeginCreateDatabaseCallback(IAsyncResult ar) in E:\Visual Studio 2010\Projects\Sandbox Console\Program.cs:line 26
at System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously)
InnerException:

我真的不需要 EndCreateDatabase 的结果,但我读到的所有地方都说你必须调用 EndYouFunctionHere() 否则会发生不好的事情。

有什么建议吗?

最佳答案

为服务引用生成的 EndXxx 方法具有签名:

EndXxx(IAsyncResult result);

(至少他们在我的环境中这样做——你看到了什么不同的东西吗?)

因此您实际上不需要执行转换来调用 EndXxx 方法。

但是,在那种情况下,您确实需要一些方法将服务引用(客户端实例)获取到回调方法中,因为您无法使用 AsyncResult.AsyncDelegate。您可以通过将代理对象存储在成员变量而不是局部变量中来执行此操作,或者将其作为 asyncState 传递给 BeginXxx 方法:

d.BeginCreateDatabase("", "PreConfSA", "_test",
new AsyncCallback(BeginCreateDatabaseCallback),
d); // passing d as asyncState instead of null

然后在回调中从 IAsyncResult.AsyncState 中获取它:

DatabaseManagement.DatabaseManagementClient caller =
(DatabaseManagement.DatabaseManagementClient)ar.AsyncState;

这消除了关于 IAsyncResult 的具体实现的任何假设。

关于c# - 使用服务引用时无法将 IAsyncResult 转换为 AsyncResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2435622/

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