簡體   English   中英

WCF服務中的異步調用

[英]Asynchronous calls within a WCF Service

我們遇到一種情況,需要在數據服務的InitializeService方法中執行一些長時間運行的代碼。 當前,對數據服務的第一個調用會觸發代碼,但直到長時間運行的代碼完成,才會收到響應。 不需要客戶端等待此操作完成。 我試圖使用一個新線程來執行代碼,但是隨着代碼的運行,我們正在替換服務器上的一些文件,這似乎殺死了線程並導致其炸毀。 如果我沒有在線程中運行它,那么它可以正常運行,但是InitializeService方法需要很長時間才能完成。

還有其他方法可以異步運行此代碼(是否正在考慮是否有一種以與客戶端相同的方式調用另一個方法的方法)?

提前致謝。

所有WCF通信基本上都是異步的。 每個調用在主機上旋轉其自己的線程,然后處理開始。 與我們許多人一樣,您遇到的問題是客戶端在主機完成工作之前就超時了,除了將超時設置為一些荒謬的時間之外,沒有其他簡便的方法。

最好將您的處理過程分成兩個或多個部分,以不同的步驟開始初始化過程並完成初始化過程,如下所示:

一種選擇是,您可以嘗試使用帶回叫功能的雙工WCF服務到客戶端。 換句話說,客戶端“ A”調用主機並啟動初始化例程,但是主機會立即向客戶端發送一個IntializationStart = True值,以使客戶端不必等待超時。 然后,當主機完成文件編譯后,它將調用客戶端(具有自己的偵聽器)並發送一條消息,表明初始化已准備就緒。 然后客戶端調用主機並下載處理后的文件。

這將在PC到服務器或服務器到服務器上很好地工作。

另一個選擇可以這種方式工作:客戶端“ A”聯系主機,主機啟動初始化例程,再次發送回IntializationStarted = True。 主機為客戶端“ A”設置一個內部(DB)值FilesReady = False,直到完成所有文件。 此時,主機將其內部值設置為FilesReady = True。 同時,客戶端在計時器上,每分鍾輪詢一次主機,直到它最終接收到FilesReady = True,然后下載等待的文件。

如果您談論的是iPhone到服務器或Android到服務器,那么這是一條更好的方法。

你跟着?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM