2017-09-23 12 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 호출 할 때마다에서,이 등록에 새로운 이벤트를 일으키는, 그래서 지금 당신은 해고 두 가지 이벤트가 있습니다. 두 개의 이벤트가 발생하면 dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 두 번 더 호출하여 4 가지 이벤트를 발생시킵니다. 이 번호는 dependency이 가리키는 대상이 가비지 수집 될 때까지 모든 호출마다 두 배가됩니다.

이벤트 버전의 호출에 대한 종속성을 다시 등록하지 않아야합니다 (예 : 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)에 대한 새 종속성이 등록됩니다. 이제 테이블에 변경 사항이있을 경우 onchange는 2 명의 개별 사용자에 대해 등록되므로 2 번 실행됩니다. 그러나 onchange는 2 회 등록 취소 및 재 등록됩니다. –

+0

이제 요점은 GetUnregisteredTransactions가 한 번만 실행되고 종속성이 한 번만 등록되도록하는 방법입니다. 새로운 로그인 및 브라우저 인스턴스에 관계없이 이미 등록 된 중복 등록을 방지하기 위해 무언가를 할 수 있습니까? –

+0

내 의견을 확인하십시오 –