2010-08-24 3 views
4

데이터 테이블을 반환하는 GetAlertData() 함수가 있습니다. 디버그 모드에서디버그 모드에서 함수 위에 setp 할 때 프로그램이 다르게 실행됩니다.

var dt = GetAlertData() 

행동 :

사례 1 : 나는 그것을 호출 내가 F11 모든 시간을하고 GetAlertData 기능에 갈 때, 모두가 잘 작동하고 나는 올바른 테이블을 얻을

사례 2 :이 함수에서 F10을 수행하고 단계를 넘기면 GetAlertData는 모든 값이 0으로 채워진 테이블을 반환합니다 (잘못되었습니다). (내 테이블의 열은 모두 float 데이터 유형입니다.)

해제 모드에서 디버그 모드에서 F10 키를 누르는 것과 같은 동작을합니다. 즉 다시 0으로 표시됩니다.

이유가 무엇인지에 대한 아이디어 또는 이유를 찾을 수있는 방법은 무엇입니까? 감사합니다 ..

편집 : 내 GetAlertData 기능이 같은 것입니다 ..

internal static DataSet GetAlertData() 
     { 
      using (var sqlConnection = new SqlConnection(Constants.ConnectionString)) 
      { 
       const string sproc = @"[spo_GetAlertData]"; 
       var cmd = new SqlCommand(sproc, sqlConnection) {CommandType = CommandType.StoredProcedure}; 

       cmd.Parameters.Add("@TimeWindow", SqlDbType.Int); 
       cmd.Parameters["@TimeWindow"].Value =2 
       cmd.Parameters.Add("@ThresholdTime", SqlDbType.Int); 
       cmd.Parameters["@ThresholdTime"].Value = 2 
       var dsAnalysis = new DataSet(); 
       var da = new SqlDataAdapter(cmd); 
       da.Fill(dsAnalysis); 
       if (dsAnalysis.Tables.Count > 0 && dsAnalysis.Tables[0].Rows.Count > 0) 
        return dsAnalysis; 
       return null; 
      } 
     } 
+0

방법이 보이나요 시나리오? 시각화 프로그램에? 아니면 디버거 지역 주민입니까? 시각화 프로그램의 – leppie

+0

.. –

+0

왜 메소드를 정적으로 만들려고 결정 했습니까?이 유형의 코드는 대개 인스턴스 기반 (비 정적)으로 구현됩니다. 단순히 인스턴스 메소드를 만들면 잠재적 인 스레딩 문제가 해결 될 수 있습니다. 또한 잠김 (_synchObj)을 통해 동기화를 위해 동기화를 수행하십시오. –

답변

2

고려해야 할 사항 중 하나는 F11과 F10을 사용하여 실행 시간이 달라진다는 것입니다 (각각 스테핑 및 스테핑 오버 방법). F11은 기능을 단계적으로 수행하므로 F10보다 긴 로직 스레드를 유지하므로 코드를 단계별로 실행하여 최대 속도로 실행할 수 있습니다.

요점은 응용 프로그램이 F11을 사용하여 코드를 단계별로 진행하는 데 더 많은 시간이 걸리므로 처리 시간이 길어질 때 완화되는 타이밍/스레딩 문제가 발생할 수 있다는 것입니다. 그래서 더 많은 동작이 F10 동작, 빠른 실행과 일치하는 이유입니다.

문제 영역 주위에 Thread.Sleep(250) 같은 것을 뿌리면 너무 도움이 될 것이라고 생각합니다. 나는이을 권장하지 않습니다. 이것은 타이밍 가설을 테스트하는 데 가장 좋은 최후의 수단으로 사용됩니다. 이 문제의 원인이 될 수있는 항목을 동시에 실행해야합니다.

+0

아 ... 마침내 얻었습니다. 간단한 thread.sleep 그것을하지 않았다 ... 이유를 찾으려고 노력 - 그것은 동일한 DB에서 수정 두 스레드의 나쁜 상호 작용을했다. 당신의 대답은 가장 가까운 :) –

1

GetAlertData의 소스 코드를 보지 않고, 나는 당신이 속성에 액세스 일부 시계 변수를 설정하거나 것을 추측 만 할 수 있습니다 결과를 바꾸는 부작용이있는 것. GetAlertData 메소드를 실행하면 시계가 범위에 포함됩니다.

+0

이 코드를 더 추가했습니다 .. –

1

가장 큰 문제는 사용자가 단계를 수행 할 때 autos/locals/watch 윈도우에서 평가되는 부작용이있는 속성 또는 .ToString이있는 것입니다. F11의 경우이 속성은 해당 창 중 하나에 배치되고 평가되며 부작용으로 인해 시나리오가 작동합니다. F10 시나리오에서는 발생하지 않으며 시나리오가 실패합니다.

암시 적 기능 평가를 비활성화하여 쉽게 테스트 할 수 있습니다.

  • 도구 -> 옵션
  • 디버거
  • 의 선택을 취소 "암시 적 특성과 통화를 사용"체크 박스
  • 다시 실행
관련 문제