C# 如何防止两个事件之间的读写错误?

C# 如何防止两个事件之间的读写错误?,c#,multithreading,windows-10,windows-10-mobile,C#,Multithreading,Windows 10,Windows 10 Mobile,我有一个布尔值_isTextChanged,有两个事件将在一个类中访问此变量。我得到一些读写不一致,我认为这是由多线程问题造成的。但不知道如何解决这个问题。我试着用锁,但似乎没用。代码如下所示 private void A_event(object sender, RoutedEventArgs e) { if(somecondition && !_hasTextChanged) { Dosomething(); } _hasT

我有一个布尔值_isTextChanged,有两个事件将在一个类中访问此变量。我得到一些读写不一致,我认为这是由多线程问题造成的。但不知道如何解决这个问题。我试着用锁,但似乎没用。代码如下所示

 private void A_event(object sender, RoutedEventArgs e)
 {
    if(somecondition && !_hasTextChanged)
    {
        Dosomething();
    }
    _hasTextChanged = false;
 }


private void B_event(object sender, RoutedEventArgs e)
{
    DosomethingElse();
    _hasTextChanged = true;
}
这种情况是,在调用了一次B_事件之后,调用了一个_事件,然后_hasTextChanged将设置为false,但是第二次调用了一个_事件时,_hasTextChanged将更改为true,而不会实际命中B_事件中的代码,B_事件是唯一将_hasTextChanged设置为true的地方。我认为这是一个多线程问题。但不知道如何解决这个问题。我尝试了以下代码,但没有解决问题

private Object thisLock = new Object();
private void A_event(object sender, RoutedEventArgs e)
{
    if(somecondition && !_hasTextChanged)
    {
        Dosomething();
    }
    Lock(thisLock)
    {
        _hasTextChanged = false;
    }
}

private void B_event(object sender, RoutedEventArgs e)
{
    DosomethingElse();
    Lock(thisLock)
    {
        _hasTextChanged = true;
    }
}

有什么想法吗?

不仔细看,我注意到的第一件事是您正在使用共享资源--
\u hasTexstChanged
锁外:

if(somecondition && !_hasTextChanged)
{
    Dosomething();
}
您需要保护对跨线程共享资源的所有访问(读或写):

Lock(thisLock)
{
    if(somecondition && !_hasTextChanged)
    {
        Dosomething();
    }        
    _hasTextChanged = false;
}

您需要在每次访问
\u hasTextChanged
时保持锁定,而不仅仅是其中的一些。另外,在调用
Dosomething()
之前,您可能希望将
\u hasTextChanged
设置为false,否则可能会错过通知。@DavidSchwartz感谢您的锁定建议,但似乎没有解决问题。我想知道在调用Dosomething()之前,为什么要将_hasTextChanged设置为false,因为只有当_hasTextChanged为false时,才能执行Dosomething()。谢谢那我想我根本不懂你的代码。
\u hasTextChanged
的作用是什么?如果事情没有改变,你为什么要做?那你为什么不再关心它是否改变了?@DavidSchwartz我的错,我误解了它的流动。。。不知怎的…谢谢你!如何实例化这个类?请使用此.GetHashCode(),并确保在遇到一致性问题时它与实例id相同谢谢您的建议,但似乎无法解决问题。我误解了工作流,问题已解决,谢谢!