简体   繁体   中英

WCF events in server-side

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
{
    [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;
    }
}

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM