【发布时间】:2014-08-27 00:27:35
【问题描述】:
我开发的下载管理器应用程序由两部分组成: 1) Duplex 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.DownloadManager_ServiceReference.IDownloadManagerServiceCallback.UpdateSelectedDownload(DownloadManager_Client.DownloadManager_ServiceReference.DownloadStatus)”,因为它不包含适当的返回“void”类型。
这里DownloadManager_Client是WPF客户端项目的名称,DownloadManager_ServiceReference是客户端项目中WCF服务的服务引用名称。我该如何纠正这个错误?
【问题讨论】:
-
您不需要在客户端和服务器上使用相同的接口。您可以在服务器上拥有一个没有 Task 的接口,而在客户端上拥有一个与 Task 兼容的接口定义。
-
另外,您使用 async 毫无意义,只会降低性能。