繁体   English   中英

在双工WCF服务的客户端中使用基于任务的异步模式时出错

[英]Error when I use the Task-based Asynchronous Pattern in the client of duplex WCF service

我开发的下载管理器应用程序包括两个部分:1)双工WCF服务,该服务执行下载并将下载状态数据实时发送到客户端。 2)WPF客户端,该客户端从服务接收下载状态数据并显示在DataGrid中。 我的双工WCF服务中有一个回调接口

 [ServiceContract(CallbackContract = typeof(IDownloadManagerServiceCalback))] 
 public interface IDownloadManagerServiceCalback
 {
     /// <summary>
     /// Returns changed downloading status to client.
     /// </summary>
     /// <returns>Downloading which has changed status</returns>
     [OperationContract(IsOneWay = true)]
     void UpdateSelectedDownload(DownloadStatus p_SelectedDownload);
 }

在客户端,我实现此接口:

 class CallbackHandler : IDownloadManagerServiceCallback
 {
     /// <summary>
     /// "Download status changed" event.
     /// </summary>
     public event EventHandler<DownloadStatusChangedEventArgs> DownloadStatusChanged;

     public async Task UpdateSelectedDownload(DownloadStatus p_UpdatedDownload)
     {
         await Task.Run(() =>
         {
             // If handler was subscribed to event:
             if (DownloadStatusChanged != null)
             {
                  DownloadStatus updatedDownload = p_UpdatedDownload;
                  DownloadStatusChangedEventArgs updatedDownloadArgs = new DownloadStatusChangedEventArgs();
                  updatedDownloadArgs.Download = updatedDownload;
                  DownloadStatusChanged(this, updatedDownloadArgs);
             }
         });
    }
 }

生成解决方案时,我遇到以下错误(错误消息的文本我从俄语翻译成英语,因为我的Visual Studio 2013是俄语):

DownloadManager_Client.CallbackHandler没有实现成员“ DownloadManager_Client.DownloadManager_ServiceReference.IDownloadManagerServiceCallback.UpdateSelectedDownload(DownloadManager_Client.DownloadManager_ServiceReference.DownloadStatus)”。 无法实现“ DownloadManager_Client.CallbackHandler.UpdateSelectedDownload(DownloadManager_Client.DownloadManager_ServiceReference.DownloadStatus)”。

这里,DownloadManager_Client是WPF客户端项目的名称,DownloadManager_ServiceReference是对客户端项目中WCF服务的服务引用的名称。 我该如何纠正该错误?

接口应定义为返回Task而不是void,因为您的实现是一个返回Task异步方法

编辑:您在泡菜中,因为您想使用需要返回Task的异步方法,但是您的方法被标记为IsOneWay = true-您不能同时使用两者。 IsOneWay = false并保持异步性质,或者保持单向但删除异步。

示例1-异步方法

 [ServiceContract(CallbackContract = typeof(IDownloadManagerServiceCalback))] 
 public interface IDownloadManagerServiceCalback
 {
     /// <summary>
     /// Returns changed downloading status to client.
     /// </summary>
     /// <returns>Downloading which has changed status</returns>
     [OperationContract(IsOneWay = false)]
     Task UpdateSelectedDownload(DownloadStatus p_SelectedDownload);
 }

然后让您的原始实现返回Task

示例2-单向方法

 [ServiceContract(CallbackContract = typeof(IDownloadManagerServiceCalback))] 
 public interface IDownloadManagerServiceCalback
 {
     /// <summary>
     /// Returns changed downloading status to client.
     /// </summary>
     /// <returns>Downloading which has changed status</returns>
     [OperationContract(IsOneWay = true)]
     void UpdateSelectedDownload(DownloadStatus p_SelectedDownload);
 }

在您的实现中,删除所有等待的内容; 异步; 任务。

一般

异步WCF方法应返回TaskTask <T> 唯一的异步无效时间是在事件处理程序期间,此处不适用。

作为使用异步方法的一般规则,请避免像瘟疫一样避免 异步无效 ,因为在这种方法内部的try catch中抛出的异常无法通过常规try-catch捕获。 唯一的例外(在事件处理程序中无双关语)。

异步void方法具有不同的错误处理语义。 从异步Task或异步Task方法抛出异常时,将捕获该异常并将其放置在Task对象上。 使用异步void方法时,没有Task对象,因此从异步void方法抛出的任何异常都将直接在启动异步void方法时处于活动状态的SynchronizationContext上引发。 更多...

你想知道更多吗?

异步编程最佳实践

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM