问题出在哪里?
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
始终为真......
答案 0 :(得分:5)
VolatileWrite
对bool
变量的操作没有重载。我对Interlocked
类有同样的问题。我的解决方法是改为使用int
,false
使用0,true
使用1。这是一个讨厌的黑客,但它的确有效。
答案 1 :(得分:2)
基本上,VolatileWrite
对于布尔字段没有重载。
有什么理由不使用volatile字段开头?或者您可以使用不同类型的字段,如cdhowie建议的那样。
我个人因为尝试编写无锁代码而感到紧张。这很容易出错。您是否有使用更高级别构建模块的当前设计的替代方案?如果您使用的是.NET 4,则新的任务并行库非常有用。
答案 2 :(得分:2)
我认为你真正的问题是Thread.Sleep
应该在调用Invoke
之前,而不是在内部。我猜是line.Dispatcher.Invoke在UI线程上执行操作。因此,只有在操作完成后,第二次单击才会将stillSingleClick设置为false。
答案 3 :(得分:0)
VolativeWrite对布尔值没有重载。