2010-11-22 5 views
1

어디에 문제가 있습니까?VolatileWrite 불리언

bool stillSingleClick = false; 

// does not compime 
System.Threading.Thread.VolatileWrite(ref stillSingleClick, true); 

'System.Threading.Thread.VolatileWrite (REF 개체, 개체)'에 가장 적합한 오버로드 된 메서드 일치

왜 물어 않는 일부 무효 인수가 .. I 다음과 같은 방법으로 내에서 doubleClick을 차별화하려고 :

volatile bool stillSingleClick = false; 

void SegmentLine_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    SegmentLine line = sender as SegmentLine; 

    if (e.ClickCount == 1) 
    { 
     stillSingleClick = true; 

     Thread thread = new Thread(
      new System.Threading.ThreadStart(
       delegate() 
       { 
        line.Dispatcher.Invoke(
         System.Windows.Threading.DispatcherPriority.Normal, 
         new Action(
          delegate() 
          { 
           Thread.Sleep(System.Windows.Forms.SystemInformation.DoubleClickTime * 2); 
           if (stillSingleClick) // HERE ALWAYS TRUE!!! 
           { 
            SelectSegmentLine(line); 
           } 
           stillSingleClick = false; 
          } 
        )); 
       } 
     )); 
     thread.Start(); 
    } 
    else if (e.ClickCount == 2) 
    { 
     stillSingleClick = false; // HERE SHOULD BE SET IN FALSE !!! 
     DisplaySegmentLineInfo(line); 
    } 
} 

가을 작동하지 않습니다은 항상 참입니다 ...

답변

2

기본적으로 부울 필드의 경우 VolatileWrite에 과부하가 없습니다.

시작하기 위해 휘발성 필드를 사용하지 않는 이유는 무엇입니까? 또는 cdhowie가 제안한 것처럼 다른 유형의 필드를 사용할 수도 있습니다.

개인적으로 나는 자물쇠가없는 코드를 작성하려고 신경이 쓰입니다. 잘못된 것이 너무 쉽습니다. 더 높은 수준의 빌딩 블록을 사용하여 현재 디자인을 대체 할 수 있습니까? .NET 4를 사용하는 경우 새로운 작업 병렬 라이브러리가 매우 유용 할 수 있습니다.

5

VolatileWritebool 변수에서 작동하기위한 과부하가 없습니다. 난 Interlocked 클래스와 같은 문제가 생겼다. 제 해결 방법은 int 대신 false의 경우 0을 사용하고 true의 경우 1을 사용하는 것입니다. 불쾌한 해킹이지만 작동합니다.

+0

휘발성 필드로 업데이트 설명 – serhio

+0

+1 @cdhowie 예 int를 사용하는 것은 잘못되었지만 때때로 정확하게 동일한 작업을 수행해야합니다. True와 False에 대한 const가 있어야 할 때 잘못된 생각을하는 경우 : –

+0

그래서 Jon이 제안한 것처럼 휘발성 논리 연산을 사용하지 않은 이유는 무엇입니까? – serhio

2

Thread.SleepInvoke을 호출하기 전에 넣어 두어야한다는 것이 실제 문제라고 생각합니다. line.Dispatcher.Invoke가 UI 스레드에서 작업을 실행합니다. 따라서 두 번째 클릭은 작업이 끝난 후에 만 ​​stillSingleClick을 false로 설정합니다.

+0

감사합니다. 귀하의 발언은 Click 문제를 해결하는 데 도움이되었습니다 – serhio

0

VolativeWrite에는 부울에 대한 오버로드가 없습니다.

+0

:) 너무 늦었습니다. – serhio

관련 문제