2015-05-22 25 views
4

我有一個長時間運行的方法(做各種生物學相關的查詢和比對和奇怪的東西的)的WCF服務。MaxConcurrentCalls,我如何告訴客戶端其呼叫已排隊? basicHttpBinding的

該代碼利用了一個方法調用的RAM和CPU好,所以讓太多的併發呼叫只是停滯不前下來的記憶。所以我真的不介意將MaxConcurrentCalls設置爲1.(我現在有它在3這是OK)。

我擔心的是,當該方法被調用和排隊,我想我的客戶立刻知道它得到了排隊。那可能嗎?

或者只是沒有將其排入所有,並與一些故障做出反應,這可能嗎?

至少,我想,如果客戶端斷開連接或超時我想它不處理,這可能嗎? (我想,如果超時,可能實際上無法處理,但如果我給它喜歡在同一時間6個請求,然後關閉所有似乎客戶喜歡它運行-eventually-所有6個請求,我縮短超時和我認爲它可能沒有全部運行6,我將不得不調查更多)

我只是不希望客戶端旋轉3分鐘(我們的超時 - 只有在事情排隊時纔打中),然後處理超時3分鐘後。我寧願它只是識別隊列已滿,說盡量回來以後馬上,也許我們可以增加我們的超時(但我會想馬上說「嘿,你是排隊,可能需要一段時間」)。我絕對不希望它超時,所以客戶端等待並且沒有任何東西,它仍然在後端處理。

我看到了的net.tcp將ListenBackLog設置的設置一些東西,但我們使用不同的結合,將我們要切換?切換工作?

+1

爲什麼沒有服務方法檢查「隊列」是否已滿,並返回一個SOAP錯誤? – Tim

+0

我很喜歡這個,但我沒有看到任何地方/如果有可能檢查隊列。當您設置MaxConcurrentCalls時,WCF處理隊列,它會通過max將呼叫發送到隊列中。但我似乎沒有控制它。 –

+0

在處理呼叫之前,您無法發送任何信息。您需要實現自己的方法,如id enqueue()getstatus(id),而不是立即調用longmethod()。 – fdafadf

回答

1

沒有併發的方式告訴用戶隊列已滿,微軟因爲明顯的原因限制了從代碼中排隊的權限,微軟不希望你開始搞亂隊列,除非它是爲了控制它出於編程的目的,例如,將呼叫轉移到隊列中或者將一個呼叫的重要性放在另一個隊列上。

如果你想檢查時隊列已滿,有幾個方法可以做到這一點:

使用,await, lock, mutex呼叫時隊列已滿,並提示消息給客戶端,這是不是最舒適的方式,但它很有用,因爲它需要你使用多線程。

您的WCF連接到微軟的MSMQ服務和查詢消息隊列本身。這是非常有用的,但是一個負擔,因爲許多呼籲MSMQ將需要發佈給每個用戶。

沒有直接的方式告訴他不幸排隊,當我遇到這個問題我自己很多次,不得不做變通的用戶。

在我的情況下,互斥體是我的解決方案救星,現在我建議使用await調用而不是查詢MSMQ,它可能需要打開另一個線程,但它會爲您提供所需的。

1

接受更多的呼叫(maxconcurrentcalls = 10)。在你的方法的情況下,做當前並行調用的次數(InterlockedIncrement之初,InterlockedDecrement在finally塊)如果InterlockedIncrement返回大於3(並行處理的最大計數)終止當前的處理(拋出異常)。

總結:接受許多調用,儘早終止那些對於服務器來說太多的處理。

0

我的解決方案是實現一個Service.IsServiceAvailable方法,它返回true。

從客戶端我首先調用此方法與一個短暫的超時行爲。當我用這個ping得到任何異常時,我會調用Worker-Method。

我認爲,當我通過用戶交互生成客戶端實例時,在一臺計算機上使用命名管道的情況下,此功能已經足夠好了。

但考慮一下,我更喜歡@Mikl X Answer。