2015-01-17 4 views
1

I 다음 코드를 가지고블록 변수

private DateTime lastUploadActivityTime = DateTime.Now; 
private void HttpSendProgress(object sender, HttpProgressEventArgs e) 
{ 
    // update variable 
    lastUploadActivityTime = DateTime.Now; 
    ...... 
    boolThreadAvailableTargetSiteActive = false; 
} 

// this method is executed in different thread, than method above 
private void ThreadCheckAvailableTargetSite() 
{ 
    while (boolThreadAvailableTargetSiteActive) 
    { 
     if (lastUploadActivityTime.AddSeconds(5) <= DateTime.Now) 
     { 
      MessageBox.Show("BREAK"); 
      boolThreadAvailableTargetSiteActive = false; 
     } 
     Thread.Sleep(500); 
    } 
} 

난 (lastUploadActivityTime = DateTime.Now;시) 첫 번째 방법에서 가변 lastUploadActivityTime 차단해야 번째 방법 (lastUploadActivityTime.AddSeconds(5) <= DateTime.Now)에 lastUploadActivityTime 읽기 방지한다. 내가 어떻게 해? Mutex 변수를 읽지 못하게합니까?

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

답변

1

lock 키워드가 다른 스레드가 임계 영역에있는 동안 하나 개의 스레드 코드의 중요한 부분을 입력하지 않는 것을 보장 읽어 syncronize하는 두 가지 방법 대신 잠금을 사용합니다. 다른 스레드가 잠긴 코드를 입력하려고하면 객체가 해제 될 때까지 블록을 기다립니다. 모범 사례는 잠글 사설 개체를 정의하거나 모든 인스턴스에 공통된 데이터를 보호하기 위해 개인 정적 개체 변수를 정의하는 것입니다.

private object syncLock = new object(); 
private DateTime lastUploadActivityTime = DateTime.Now; 
private void HttpSendProgress(object sender, HttpProgressEventArgs e) 
{ 
    // update variable 
    lock (syncLock) 
    { 
     lastUploadActivityTime = DateTime.Now; 
    } 
} 

// this method is executed in different thread, than method above 
private void ThreadCheckAvailableTargetSite() 
{ 
    while (boolThreadAvailableTargetSiteActive) 
    { 
     lock (syncLock) 
     { 
      if (lastUploadActivityTime.AddSeconds(5) <= DateTime.Now) 
      { 
       MessageBox.Show("BREAK"); 
       boolThreadAvailableTargetSiteActive = false; 
      } 
     } 
     Thread.Sleep(500); 
    } 
} 
+0

"잠금"은 읽기 잠금이 아니라 쓰기 잠금에 사용됩니다 ... –

+0

잠금 변수는 참조 유형이어야합니다 :) –

+1

lock 키워드는 다른 스레드가있는 동안 한 스레드가 중요한 코드 섹션에 들어 가지 않도록합니다 중요한 부분. 다른 스레드가 잠긴 코드를 입력하려고하면 객체가 해제 될 때까지 블록을 기다립니다. – Sievajet

관련 문제