我正在開發使用WPF和WCF的客戶端/服務器應用程序。 服務器應用程序託管一個WCF服務,負責執行客戶端請求並在出現問題時回調它們。在忙於長時間運行的操作時Ping應答WCF服務
服務接口與所有的OneWay
操作定義一個雙工回調合同。
(簡體)IService
[ServiceContract(CallbackContract = typeof(ISrvServiceCallback))]
public interface ISrvService
{
[OperationContract(IsOneWay = true)]
void Ping();
[OperationContract(IsOneWay = true)]
void LongRunningOperation();
}
public interface ISrvServiceCallback
{
[OperationContract(IsOneWay = true)]
void PingReply();
[OperationContract(IsOneWay = true)]
void LongRunningOperationStatus(string reply);
}
的服務需要十個分量某些對象根據客戶端的調用改變狀態。出於這個原因,我決定有一個單身人士的服務。
(簡體)服務
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class SrvService : ISrvService
{
MyObject statusObject;
public void LongRunningOperation()
{
//calling back the client reporting operation status
OperationContext.Current.GetCallbackChannel<ISrvServiceCallback>()
.LongRunningOperationStatus("starting long running application");
statusObject.elaborateStatus();
//calling back the client reporting object status
OperationContext.Current.GetCallbackChannel<ISrvServiceCallback>()
.LongRunningOperationStatus("object status: " + statusObject.ToString());
}
public void Ping()
{
OperationContext.Current.GetCallbackChannel<ISrvServiceCallback>().PingReply();
}
public SrvService()
{
statusObject= ...statusObject init...
}
}
正如你可以看到我有一個平操作由服務暴露了一個客戶端調用(每5秒),以檢查是否在服務器應用程序上可用網絡(每個客戶端有一個服務器連接圖標與紅色 =服務器不可用,綠色 =服務器不可用)。
當客戶端請求長時間運行的操作,啓動服務器上運行的工作,不能回覆ping請求(客戶端的服務器連接圖標變爲紅色)。
一旦長時間運行的操作完成時,服務器迴應所有由客戶提出的要求和服務器連接圖標重新變綠)。
我想找到一種方法來開發服務,以便服務器始終迴應ping請求,也是在長時間運行時。
- 我怎麼能做到這一點考慮,我需要保持
InstanceContextMode.Single
到十個分量的 服務對象的狀態? - 是否有其他/更好的方法來ping WCF服務 可用性和可視化顯示客戶端上的結果?
謝謝你的回覆@ plast1k!我對異步知識很少,而且我實際上也在探索這個領域。 客戶端使用調用_ThreadPool.QueueUserWorkItem(checkService)_的_DispatcherTimer_來ping服務。 _checkService_調用_serviceClient.Ping()_。 我會看看你發佈的所有鏈接,看看我能如何解決我的問題。 是否有可能有你的異步/等待單例服務實現的一些示例代碼?只是想知道如何從客戶端調用並從服務器回覆。 – aDone
沒問題。我應該能夠稍後再挖掘一些,如果我找到它,我會編輯我的帖子。 – plast1k
@aDone示例添加,對不起,花了這麼久! – plast1k