2017-11-14 8 views
1

イベントをカスタムパラメータでバインドする際に問題があります。次回のサブスクライブ中にサブスクライブしないでください。基本的に1回目の購読イベントの場合、1回目のイベントを保持し、2回目の購読時に新しいイベントを作成します。 2つのイベントがあり、3つ目は3つのイベントがあることを意味します。しかし、私は1つのイベントが毎回購読し、最後のイベントを退会している間だけ必要です。イベントをsqldependencyでバインドし、Cでサブスクライブする方法#

  1. dependency_Update機能
public void dependency_Update(Guid clientid) 
{ 
    SqlDependency.Stop(connString); 
    using (SqlCommand command = new SqlCommand(SQL.newemailmessagescountbyclient_sql(), connection)) 
    { 
     connection.Open(); 
     command.Parameters.Add(new SqlParameter("@clientid", clientid)); 
     command.Notification = null; 
     SqlDependency.Start(connString); 
     SqlDependency dependency = new SqlDependency(command); 
     dependency.OnChange += new OnChangeEventHandler((s, e) => dependency_OnChange(s, e, dependency, clientid)); 
     dependency.OnChange -= new OnChangeEventHandler((s, e) => dependency_OnChange(s, e, dependency, clientid)); 
     var reader = command.ExecuteReader(); 
     connection.Close(); 

    } 
} 
  • dependency_OnChangeイベント
  • public void dependency_OnChange(object sender, SqlNotificationEventArgs e, SqlDependency dependency, Guid clientid) 
    { 
        if (e.Type == SqlNotificationType.Change) 
        { 
        //subscribe function again 
        dependency_Update(clientid); 
        } 
    } 
    
      いずれかが、そのためのソリューションを持つことができ

      、私を助けてください、私は感謝

    +0

    あなたの問題を明確にすることはできますか? "次回購読中に購読を停止しない"ということはあまり明確ではありません。あなたが期待していること、何がうまくいかないのか? – Evk

    +0

    @Evkあなたの応答のおかげで、私はちょうど – adnan

    答えて

    0

    このブロック

    dependency.OnChange += new OnChangeEventHandler((s, e) => dependency_OnChange(s, e, dependency, clientid)); 
    dependency.OnChange -= new OnChangeEventHandler((s, e) => dependency_OnChange(s, e, dependency, clientid)); 
    

    は何も有効ではありません、あなたの貴重な時間を感謝しています。まず、その意図は奇妙です - あなたは購読しようとしており、すぐに購読を中止しようとしています。 2つ目は、期待通りに動作しません。なぜなら、同じように見えても、2つの無名関数ハンドラが異なるからです。実際には、OnChangeイベントからハンドラーの登録を解除することは決してありません。あなたがanonymoys機能を使用したい場合は、そのようにそれを実行します。

    SqlDependency dependency = new SqlDependency(command); 
    OnChangeEventHandler handler = null; 
    handler = (s, e) => dependency_OnChange(s, e, clientid, handler); 
    dependency.OnChange += handler; 
    
    public void dependency_OnChange(object sender, SqlNotificationEventArgs e, Guid clientid, OnChangeEventHandler handler) { 
        var dependency = (SqlDependency)sender; 
        if (e.Type == SqlNotificationType.Change) { 
         dependency.OnChange -= handler; 
         //subscribe function again 
         dependency_Update(clientid); 
        } 
    } 
    

    またはこのよう:

    OnChangeEventHandler handler = null; 
    handler = (s, e) => { 
         dependency.OnChange -= handler; 
         dependency_OnChange(s, e, clientid);      
    }; 
    dependency.OnChange += handler; 
    
    +0

    質問を更新する私は両方の方法を使用して同じ問題があります。 – adnan

    +0

    私は再び同じ問題を抱えているので、何が問題なのかを見ることができますか?ありがとう – adnan

    +0

    @adnan同じ問題がどのくらい正確に見えますか?どのようにテストしますか? – Evk

    関連する問題