2015-12-10 29 views
0

一个新的我明白,我需要每收到一个回调时不断更新OnChangeEventHandler之前没有OnChangeEventHandler。如何查看有添加在SQL服务器

我想确保有添加一个新的人之前没有现成的处理程序。

我该怎么做?有计数吗? (见这里评论)?

public void InitialiseDependency(Action onDependencyMethod) 
    { 
     this.onDependencyMethod = onDependencyMethod; 
     SqlDependency.Start(connectionString, null); 

     using (SqlCommand command = new SqlCommand(
       "SELECT [Symbol] FROM [dbo].[tblOrders] WHERE [Status] = 'NEW'", 
       conn)) 
     { 

      SqlDependency dependency = new SqlDependency(command); 

      //HERE if (dependency.OnChangeEventHandlers.count()) > 0 { return; } 

      dependency.OnChange += new OnChangeEventHandler(OnDependencyChange); 

      using (SqlDataReader reader = command.ExecuteReader()) 
      { 
       // Process the DataReader. 
      } 
     } 
    } 
+0

是否'dependency.OnChange'有像'dependency.OnChange.GetInvocationList()'的方法? –

+0

@MikeNakis它,但你不能用'OnChange'比的'+ ='或'左侧之外的任何地方 - =',所以你不能直接将调用列表或将其转换为' MultiCastDelegate'。 –

+1

@MikeNakis不,它是一个'event',它改变了一些规则。 –

回答

0

没有一个简单的方法来做到这一点,但如果你看看通过reference source,你可以看到,有一个领域是_eventList被添加每个OnChange事件添加到时间。

因此,为了得到这个数字,我们需要做一些反思:

var countList = dependency.GetType().GetField("_eventList", 
        BindingFlags.NonPublic | BindingFlags.Instance) 
        .GetValue(dependency); 

下一个问题是,countList是一个内部类的List,但它会返回一个对象。为了得到计数,我们需要把它转换为第一的IList

int count = ((IList)countList).Count; 

之后,你应该有活动用户数的计数。值得注意的是它只适用于这种类型,因为其他类型不一定以相同的方式实现事件。

+0

但是,在我的代码中每次都创建新的依赖关系(我遵循了我在网上发现的示例)是否会有以前的列表? – ManInMoon

+0

不,在这种情况下,我不确定您如何合理地期望某件东西已经订阅了它? –

+0

那么,依赖关系触发器确实超越了上述方法中变量的范围。我真的很难理解正在发生的事情。我认为,在代码中的依赖性是暂时的,只是用来设置一个依赖于服务器... – ManInMoon