2012-08-08 4 views
0

저는 ASP.NET 환경에서 SignalR을 사용하여 여러 위젯이 포함 된 실시간 대시 보드를 구축하고 있습니다. 모든 위젯이 기본 데이터를로드 한 후에는 각 위젯이 독립적으로 데이터를 업데이트해야합니다. 즉, 여러 타이머를 사용하여 데이터베이스에서 데이터가 업데이트되고 있음을 의미합니다.대시 보드 위젯을 업데이트하기위한 C 타이머 및/또는 잠금 사용

public static void Init(){  

    Stopwatch.Start(); 

    _timer = new Timer(_ => 
    { 
     if (_updating) 
     { 
      return; 
     } 
     _updating = true; 

     try 
     { 
      var timeDiffSecs = Stopwatch.Elapsed.TotalSeconds; 
      Stopwatch.Restart(); 

      if (timeDiffSecs <= 0) 
      { 
       return; 
      } 

      //DoMyActionForUpdate 
     } 
     finally 
     { 
      _updating = false; 
     } 
    }, null, TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(3)); 
} 
+1

당신의 GUI (WPF, Windows Forms 등)에 어떤 프레임 워크를 사용하고 있습니까? – dsolimano

+0

어떤 종류의 타이머입니까? 그것이 'DispatcherTimer' 또는 Windows.Forms.Timer 인 경우 UI 스레드에서 실행됩니다 ... – davisoa

+0

@dsolimano 그는 SignalR과 ASP.NET을 사용하고 있다고 말했습니다. GUI가 없습니다. –

답변

1

: 이것은 내가 지금 사용하고 코드

지금 내 질문은 위의 상황에서 타이머를 사용하는 가장 좋은 방법이 무엇인지, 그리고 나는 그것이

스레드로부터 안전이 확인의 방법을 만들 수 있습니다 System.Timers.TimerSystem.Threading.TimerElapsed 이벤트를 호출하고 스레드 풀 스레드로 각각 콜백합니다. (당신이 사용하고있는 것을 상세하게 설명하지 않았다) 이것은 다른 타이머와 다른 스레드에서 실행될 것이라는 의미입니다. 이것은 여러 스레드를 시작한 경우와 동일합니다. 이러한 루틴을 스레드로부터 안전하게 만들어야합니다.

이러한 스레드가 시작된 방법에 관계없이 기술은 동일합니다. 원자 적으로 액세스 할 수없는 스레드간에 공유 될 수있는 모든 데이터는 다른 스레드와 동기화되어야합니다. 이는 일반적으로 lock 키워드로 수행됩니다. 공유 데이터를 사용하는 것으로 보이는 코드를 제공하지 않았습니다. 하지만 데이터베이스에 대한 액세스를 언급하면됩니다. 데이터베이스에 대한 공유 연결이있는 경우에는 한 번에 하나의 스레드 만 해당 연결을 사용해야합니다. 예 :

lock(locker) 
{ 
     SqlCommand command = new SqlCommand(queryString, connection); 
     command.ExecuteNonQuery();} 
} 

"locker"라는 필드의 사용법을 보여줍니다. 이것을 만들어야합니다 (단지 Object). 모든 스레드를 공유해야합니다.

구체적으로하고있는 일에 대해 자세히 설명해주십시오. 누군가 좀 더 자세한 답변을 제공 할 수 있습니다.