2010-11-22 6 views
1

どこに問題がありますか?VolatileWriteブール値

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は常にTrueになります....

答えて

2

ブールフィールドの場合、VolatileWriteのオーバーロードはありません。

最初に揮発性フィールドを使用しない理由は何ですか?あるいは、cdhowieが提案したように、別のタイプのフィールドを使用することもできます。

個人的に私は、ロックフリーのコードを書くのに神経質になります。間違ってしまうのはとても簡単です。より高いレベルのビルディングブロックを使用して現在のデザインに代わるものはありますか? .NET 4を使用している場合、新しいTasks Parallel Libraryは非常に便利です。

5

VolatileWriteは、変数boolで動作するための過負荷がありません。私はInterlockedクラスでこの同じ問題を抱えています。私の回避策は、代わりにintを使用し、falseには0を、trueには1を使用しました。それは厄介なハックですが、うまくいきます。

+0

揮発性フィールドで更新された説明 – serhio

+0

+1 @cdhowieはい、intを使用するのが間違っていますが、機会に同じようにする必要があります。 TrueとFalseのconstを持たなければならないときは、さらに悪いと感じる場合: –

+0

Jonのように、なぜ揮発性ブール値を使用しなかったのですか? – serhio

2

あなたの本当の問題はThread.SleepInvokeへのコールの前に置かれるべきであると思います。私はラインを推測しています.Dispatcher.InvokeはUIスレッドでアクションを実行します。したがって、2回目のクリックでは、アクションが完了した後にのみstillSingleClickがfalseに設定されます。

+0

ありがとう、あなたの発言は私がClickの問題を解決するのを助けた – serhio

0

VolativeWriteにはブール値に対するオーバーロードはありません。

+0

:)あまりにも遅く、男、ありがとう – serhio