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

C# 使用服务引用时无法将IAsyncResult转换为AsyncResult,c#,.net,wcf,asynchronous,C#,.net,Wcf,Asynchronous,我运行了一个WCF服务,通过在解决方案资源管理器中使用Add service reference添加了对该服务的引用,并选中了create asynchronous operations框 我的呼叫工作正常,我有一个双向通道,从服务器报告一些事件,我正在接收这些事件。但是,当异步任务在我的回调处理程序中完成时,出现错误无法将类型为“SendAsyncResult”的对象强制转换为类型为“System.Runtime.Remoting.Messaging.AsyncResult”。 调用该方法的代

我运行了一个WCF服务,通过在解决方案资源管理器中使用Add service reference添加了对该服务的引用,并选中了create asynchronous operations框

我的呼叫工作正常,我有一个双向通道,从服务器报告一些事件,我正在接收这些事件。但是,当异步任务在我的回调处理程序中完成时,出现错误
无法将类型为“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具体实现的任何假设。

是否确实需要强制转换?有没有其他方法可以让您保留对拨打此电话的客户机的引用?这很有意义。我过去所做的是用一个应用程序服务类包装生成的WebServiceClient类,该类保留调用方引用。