2012-07-03 38 views
2

Explenation ImageC#ConcurrentQueue - 在Enqueue發生時引發事件?

我有一個WCF服務託管在Windows服務中。

WCF服務注入用ConcurrentQueue < SomeClass的>

Windows服務(託管WCF服務)也被注入與ConcurrentQueue < SomeClass的>

Windows服務啓動WCF服務,並且還產生一個工作線程。

工作者線程推(排入)SomeClass的的對象到ConccurrentQueue

我想以某種方式爲WCF服務當一個對象被排入到ConcurrentQueue,使其能夠出列,它(以及任何其他物體,可能是在隊列中),並且將消息發送到所有被觸發連接客戶端。

兩個問題:

  1. 如何讓我的WCF服務「鉤」上注入ConccurentQueue的「排隊」的方法,這樣,當對象被推進了隊列 - WCF服務會做些什麼呢?

  2. 如果我管理以某種方式掛鉤「排隊」事件,現在在Windows服務的工作線程排隊對象到隊列中 - 這意味着它也將「觸發」 WCF服務的「排隊掛鉤「兩次 - 這兩個觸發事件是否會發生在不同的線程中?我需要以某種方式確保WCF服務按順序從隊列中抽取對象。我不想突然看到,對於每一個入隊操作 - 在一個單獨的線程的WCF服務觸發並拉起對象了......

我希望我的問題是不夠清楚......

[更新]

與克里斯聊天后,我得出的結論是,走在這一點的最好辦法是單獨從WCF服務的工作線程,使工作線程作爲客戶端調用WCF服務。這意味着我不必在隊列中玩耍。

回答

3

將ConcurrentQueue包裝在一個顯示Enqueue的簡單類中& Dequeue調用,然後將您的鉤子放入此類中。每當調用YourClass.Enqueue時,都會觸發WCF活動,該活動可以調用YourClass.Dequeue。 YourClass.Dequeue會排空隊列&將其放入一個有序的可枚舉中,WCF服務可以按順序處理。

+0

問題是 - WCF服務具有 'PerSession' 的 'InstanceContextMode'。所以我真的不能通過「ConcurrentQueue」到WCF服務的構造,因爲它要求每個客戶端...所以 - 也許我應該使用,而不是「PerSession」「單」? –

+0

這將解決這個問題,只要你的服務可以作爲一個單獨 – Chris

+0

運行可能是更好的解決方案是,如果Windows服務將只連接到WCF服務的客戶 - 而只是呼籲WCF一個「發佈」方法服務,而不是使用Queue將對象傳遞給服務...不是? –