【问题标题】:WCF events in server-side服务器端的 WCF 事件
【发布时间】:2011-05-27 16:33:24
【问题描述】:

我正在 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();
}

它工作正常。但从我的代理它不会触发事件。

您有什么提示、建议,或者您能看到错误吗?

谢谢大家。

【问题讨论】:

    标签: wcf events .net-3.5 event-handling wcf-client


    【解决方案1】:

    我可以看到您的代码有两个问题,这可能是问题,也可能不是问题。

    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。

    顺便说一句:要修复 B,您可以使用某种同步机制(例如事件)来阻止直到 ee_Onfinger 触发。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      相关资源
      最近更新 更多