2017-09-23 9 views
0

重複した質問に対してお詫び申し上げます。私はグーグルで、どこでも質問だけしか見つけられませんでしたが、成功した解決策はありませんでした。私はちょうどherehereと同じ問題に直面しており、先週から苦労しましたが、何も成功しなかったので、ここで質問をすることにしました。私はこれらの質問に示唆されたコメントに従うことで、それを自分自身で解決しようとしましたが、成功しました。私は、インスタンスまたはユーザーがログインしているためSqlDependencyのonchangeイベントは、任意の数のために一度だけ起動するようにしたい。SqlDependency onchangeがブラウザインスタンスごとに複数回起動する

このメソッドは、一度だけ呼び出されるたびにアプリケーション

public List<TransactionMaster> GetUnregisteredTransactions() 
    { 
     List<TransactionMaster> ltrans = new List<TransactionMaster>(); 
     TransactionMaster trans = new TransactionMaster(); 

     using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString)) 
     { 
      string query = "SELECT TransId, ReceivedFrom,ReceivedOn,Mask FROM [dbo].TransactionMaster WHERE StageId =1"; 
      SqlDependency.Start(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString); 
      using (SqlCommand cmd = new SqlCommand(query, connection)) 
      { 
       cmd.Notification = null; 
       DataTable dt = new DataTable(); 

       SqlDependency dependency = new SqlDependency(cmd); 
       dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
       if (connection.State == ConnectionState.Closed) 
        connection.Open(); 
       SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
       adapter.Fill(dt); 
       ltrans = dal.ConvertDataTable<TransactionMaster>(dt); 
      } 
     } 
     return ltrans; 
    } 

そして再び、このメソッドが呼び出されるに、新しいユーザログインonchangeイベント

private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     if (e.Type == SqlNotificationType.Change) 
      TransactionHub.GetUnregTransactions(GetUnregisteredTransactions()); 

    } 
+1

重複していますが、関連情報をここに掲載できますか? – Stefan

+0

はい、質問を編集しました。 –

+0

退出を提案してください。 –

答えて

0

からあなたがdependency.OnChange += new OnChangeEventHandler(dependency_OnChange);を呼び出しているGetUnregisteredTransactions呼び出すたびに、これは、登録に新しいイベントを引き起こしているので、今は起動します2つのイベントがあります。 2つのイベントが発動すると、dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);が2回以上呼び出され、4つのイベントが発生します。この番号はオブジェクトdependencyが指し示すまで呼び出されるたびに2倍になり、ガベージコレクトされます。

イベントバージョンからの呼び出しに依存関係を再登録しないでください(たとえば、boolを関数に渡して登録を行うかどうかを知る)、または以前の通知を登録解除する必要があります新しいものを作成します。

以下は、登録解除の例です。

private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
{ 
    SqlDependency dependency = (SqlDependency)sender; 
    dependency.OnChange -= new OnChangeEventHandler(dependency_OnChange); 

    if (e.Type == SqlNotificationType.Change) 
     TransactionHub.GetUnregTransactions(GetUnregisteredTransactions()); 

} 
+0

はい、私はまったく同じ試みをしましたが、結果はありません。私はこの動作を理解しています。例えば、ユーザー(A)がアプリケーションにログインしたときに、GetUnregisteredTransactionsが実行され、このユーザーの依存関係が登録されている場合などです。他のユーザ(B)のログインGetUnregisteredTransactionsが再度実行され、このユーザ(B)に新しい依存関係が登録されます。テーブルに何らかの変更があった場合、2人の別個のユーザーのためにonchangeが2回実行されます。しかし、オンチェンジは登録解除され、2回再登録されます。 –

+0

ここでポイントは、GetUnregisteredTransactionsが一度だけ実行され、依存関係が一度だけ登録されるようにする方法です。新しいログインとブラウザのインス​​タンスに関係なく、すでに登録されていれば、重複登録を防ぐために何かを行うことはできますか? –

+0

私のコメントを確認してください –

関連する問題