开发者

WCF events in server-side

开发者 https://www.devze.com 2023-01-31 01:52 出处:网络
I\'m working on an application in WCF and want to receive events in the server side. I have a web that upon request needs to register a fingerprint.

I'm working on an application in WCF and want to receive events in the server side.

I have a web that upon request needs to register a fingerprint. The web page request the connection of the device and then every second for 15 seconds requests the answer.

The server-side code is apparently "simple" but doesn't work.

Here is it:

[ServiceContract]
interface IEEtest
{
    [OperationC开发者_Python百科ontract]
    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;
    }
}

every time I put my finger, it should fire the event. in fact if I

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

It works fine. but from my proxy it doesn't fire the event.

do you have any tips, recommendations, or can you see the error?

Thanks everyone.


I can see two issues with your code, which may or may not be the problem.

A) Event Registration Race Condition

You call CZ.Connect_Net() and THEN you register with the event handler. So if your event fires between calling Connect_Net() and you registering a method to handle the event then you'll not see it. Register the event handler first and then call Connect_Net().

B) EEtest lifetime.

The life time of your EEtest class depends on the Instancing Mode you use in WPF, see http://mkdot.net/blogs/dejan/archive/2008/04/29/wcf-service-behaviors-instance-and-concurrency-management.aspx. Generally the default is Per-Call which means a new instance of EEtest is created just to service the call to EEDirectConnect. So when you invoke the method EEDirectConnect you get this:

  1. EEDirectConnect invocation started.
  2. WCF makes a new EEtest class.
  3. WCF invokes the method on EEtest.
  4. The method news up a CZ and invokes the Connect-net method.
  5. The event handler is attached.
  6. The method EEDirectConnect completes.
  7. EEtest is now "unrooted" by WCF - it's eligible for GC, and hence CZ is eligible for GC.

So perhaps it takes a very short time (or it's synchronous) and the problem is A, or it's asynchronous and it takes a little bit longer and it's B.

BTW: To fix B you could use some sort of synchronisation mechanism (eg an Event) to block until ee_Onfinger fires.

0

精彩评论

暂无评论...
验证码 换一张
取 消