[英]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.