2010-12-18 94 views
0

我正在研究WCF中的應用程序,並希望在服務器端接收事件。服務器端的WCF事件

我有一個網站,根據請求需要註冊指紋。 網頁請求連接設備,然後每15秒鐘請求答案。

服務器端代碼顯然是「簡單」但不起作用。

這裏是:

[ServiceContract] 
interface IEEtest 
{ 
    [OperationContract] 
    void EEDirectConnect(); 
} 

class EETest : IEEtest 
{ 
    public void EEDirectConnect() 
    { 
     CZ ee = new CZ(); // initiates the device dll 

     ee.Connect_Net("192.168.1.200", 4011); 

     ee.OnFinger += new _IEEEvents_OnFingerEventHandler(ee_OnFinger); 

    } 

    public void ee_OnFinger() 
    { 
     //here i have a breakpoint; 
    } 
} 
每次我把我的手指時

,它應該觸發事件。其實如果我

static void Main() 
{ 
    EETest pp = new EETest(); 
    pp.EEDirectConnect(); 
} 

它工作正常。但從我的代理它不會觸發事件。

你有任何提示,建議,或者你能看到錯誤嗎?

謝謝大家。

回答

0

我可以看到兩個問題與您的代碼,這可能或可能不是問題。

A)活動報名競爭條件

你叫CZ.Connect_Net(),然後你與事件處理程序來註冊。因此,如果您的事件在調用Connect_Net()和註冊處理事件的方法之間觸發,那麼您將看不到它。首先註冊事件處理程序,然後調用Connect_Net()。 B)EEtest使用期限。

EEtest類的生命期取決於您在WPF中使用的實例化模式,請參閱http://mkdot.net/blogs/dejan/archive/2008/04/29/wcf-service-behaviors-instance-and-concurrency-management.aspx。一般來說,默認值是Per-Call,這意味着創建EEtest的新實例僅用於服務對EEDirectConnect的調用。所以當你調用方法EEDirectConnect時,你會得到:

  1. EEDirectConnect調用已啓動。
  2. WCF創建一個新的EEtest類。
  3. WCF調用EEtest上的方法。
  4. 該方法消息通過CZ並調用Connect-net方法。
  5. 附加事件處理程序。
  6. 方法EEDirectConnect完成。
  7. EEtest現在由WCF「無根據」 - 它符合GC的條件,因此CZ有資格獲得GC。

因此,也許需要很短的時間內(或者是同步的),問題是A,或者它是異步的,它需要長一點,它是B.

BTW:要解決B您能使用某種同步機制(例如事件)阻塞,直到ee_Onfinger觸發。