2010-12-18 3 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 lifetime.

EEtest 클래스의 수명은 WPF에서 사용하는 인스턴스 모드에 따라 다릅니다 (http://mkdot.net/blogs/dejan/archive/2008/04/29/wcf-service-behaviors-instance-and-concurrency-management.aspx 참조). 일반적으로 기본값은 Per-Call입니다. 즉, EEirect의 새 인스턴스가 EEDirectConnect에 대한 서비스를 제공하기 위해 만들어 졌음을 의미합니다. 따라서 EEDirectConnect 메서드를 호출하면 다음과 같이 나타납니다.

  1. EEDirectConnect 호출이 시작되었습니다.
  2. WCF는 새로운 EEtest 클래스를 만듭니다.
  3. WCF는 EEtest에서 메서드를 호출합니다.
  4. 메소드는 CZ를 업데이트하고 Connect-net 메소드를 호출합니다.
  5. 이벤트 처리기가 연결되어 있습니다.
  6. EEDirectConnect 메서드가 완료되었습니다.
  7. EEtest가 WCF에 의해 "루핑되지 않음"- GC에 적합하므로 CZ는 GC에 적합합니다.

그래서 아마도 그것은 (또는 동기의) 매우 짧은 시간이 걸리고 문제는이다, 또는 비동기 그리고 그것은 조금 더 오래 걸립니다 그리고 BTW

B.

: 당신이 할 수 B를 해결하려면 ee_Onfinger가 발생할 때까지 차단하기 위해 일종의 동기화 메커니즘 (예 : 이벤트)을 사용하십시오.