[英]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並保持異步性質,或者保持單向但刪除異步。
[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
[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方法應返回Task或Task <T> 。 唯一的異步無效時間是在事件處理程序期間,此處不適用。
作為使用異步方法的一般規則,請避免像瘟疫一樣避免 異步無效 ,因為在這種方法內部的try catch中拋出的異常無法通過常規try-catch捕獲。 唯一的例外(在事件處理程序中無雙關語)。
異步void方法具有不同的錯誤處理語義。 從異步Task或異步Task方法拋出異常時,將捕獲該異常並將其放置在Task對象上。 使用異步void方法時,沒有Task對象,因此從異步void方法拋出的任何異常都將直接在啟動異步void方法時處於活動狀態的SynchronizationContext上引發。 更多...
你想知道更多嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.