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

标签 c# .net wcf asynchronous

我正在运行一个 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/

相关文章:

单个实体引用的 WCF 序列化和 NHibernate 代理

c# - 在工作流 ("Cannot create an instance of "中删除 WCF 事件时出错 ...)

c# - 即使子目录不存在,如何创建文件

c# - 更改 deleteCommand 按钮文本

c# - 设置通用 WPF 控件的样式

c# - 删除 WinForms 中的 SplitContainer 面板填充

.net - 如何获得 .Net 应用程序中所有线程的列表?

asp.net - 在 ASP.NET 中,有没有办法编写自定义负载均衡器?

c# - 所有 View 中的单个 .NET Core Razor C# 函数

c# - 如何在 UML 类图中最好地表示 c# .net 事件结构?