VolatileWrite布尔值

时间:2010-11-22 15:23:02

标签: .net multithreading

问题出在哪里?

bool stillSingleClick = false;

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

最佳重载方法匹配   “System.Threading.Thread.VolatileWrite(参照   对象,对象)'有一些无效   参数

为什么我要问..我尝试通过以下方式区分我的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始终为真......

4 个答案:

答案 0 :(得分:5)

VolatileWritebool变量的操作没有重载。我对Interlocked类有同样的问题。我的解决方法是改为使用intfalse使用0,true使用1。这是一个讨厌的黑客,但它的确有效。

答案 1 :(得分:2)

基本上,VolatileWrite对于布尔字段没有重载。

有什么理由不使用volatile字段开头?或者您可以使用不同类型的字段,如cdhowie建议的那样。

我个人因为尝试编写无锁代码而感到紧张。这很容易出错。您是否有使用更高级别构建模块的当前设计的替代方案?如果您使用的是.NET 4,则新的任务并行库非常有用。

答案 2 :(得分:2)

我认为你真正的问题是Thread.Sleep应该在调用Invoke之前,而不是在内部。我猜是line.Dispatcher.Invoke在UI线程上执行操作。因此,只有在操作完成后,第二次单击才会将stillSingleClick设置为false。

答案 3 :(得分:0)

VolativeWrite对布尔值没有重载。