2010-11-22 48 views
1

問題在哪裏?VolatileWrite booleans

bool stillSingleClick = false; 

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

爲 'System.Threading.Thread.VolatileWrite(REF 對象,對象)' 的最佳重載的方法匹配具有一些無效 參數

爲什麼我問。我嘗試按以下方式區分我的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); 
    } 
} 

不起作用stillSingleClick始終爲真...

回答

2

對於布爾字段,基本上沒有VolatileWrite的重載。

任何不使用易失性字段開始的原因?或者您可以使用cdhowie建議的不同類型的字段。

我個人很緊張,試圖編寫無鎖代碼。錯誤很容易。使用更高級別的構件可以替代當前的設計嗎?如果您使用.NET 4,新的任務並行庫可能非常有用。

5

VolatileWrite對於在bool變量上操作沒有超載。我在Interlocked課上遇到了同樣的問題。我的解決方法是使用int代替,false使用0,true使用1。這是一個討厭的黑客,但它的工作。

+0

更新說明與易變的字段 – serhio 2010-11-22 15:37:26

+0

+1 @cdhowie是的,它使用整數感覺不對,但我必須偶爾做同樣的事情。如果你必須有const和False的感覺,那麼你會覺得更笨拙:) – 2010-11-22 15:43:15

+0

那麼,爲什麼你不使用像Jon這樣的易變的布爾值呢? – serhio 2010-11-22 17:09:43

2

我覺得你真正的問題是Thread.Sleep應該放在Invoke之前,不要放在裏面。我猜測line.Dispatcher.Invoke在UI線程上執行操作。因此,只有在動作完成後,第二次點擊纔會將stillSingleClick設置爲false。

0

VolativeWrite對布爾值沒有重載。

相關問題