簡體   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