我正在运行一个 WCF 服务,我使用解决方案资源管理器中的“添加服务引用”添加了对该服务的引用,并选中了“创建异步操作”复选框。
我的通话工作正常,我有一个双向 channel ,可以从服务器报告一些事件,并且我正在接收这些事件。但是,当异步任务在我的回调处理程序中完成时,我收到错误无法将“SendAsyncResult”类型的对象转换为“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/