如何防止两个事件之间的读写错误?
How to prevent read-write error between two events?
我有一个布尔值 _isTextChanged,有两个事件将在一个事件中访问这个变量 class。我有一些读写不一致,我认为这是由多线程问题引起的。但不确定如何解决这个问题。我尝试使用 Lock,但似乎无济于事。代码如下
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_event被调用一次后,A_event被调用,那么_hasTextChanged会被设置为false,但是第二次A_event被调用, _hasTextChanged 将更改为 true 而不会实际点击 B_event 中的代码,这是唯一将 _hasTextChanged 设置为 true 的地方。我认为这是一个 multi_threading 问题。但不确定如何解决这个问题。我尝试了以下代码,但没有解决问题
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;
}
}
有什么想法吗?
无需更仔细地查看,我注意到的第一件事是您正在使用您的共享资源 -- _hasTexstChanged
在锁之外:
if(somecondition && !_hasTextChanged)
{
Dosomething();
}
您需要保护对跨线程共享资源的所有 访问(读取或写入):
Lock(thisLock)
{
if(somecondition && !_hasTextChanged)
{
Dosomething();
}
_hasTextChanged = false;
}
我有一个布尔值 _isTextChanged,有两个事件将在一个事件中访问这个变量 class。我有一些读写不一致,我认为这是由多线程问题引起的。但不确定如何解决这个问题。我尝试使用 Lock,但似乎无济于事。代码如下
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_event被调用一次后,A_event被调用,那么_hasTextChanged会被设置为false,但是第二次A_event被调用, _hasTextChanged 将更改为 true 而不会实际点击 B_event 中的代码,这是唯一将 _hasTextChanged 设置为 true 的地方。我认为这是一个 multi_threading 问题。但不确定如何解决这个问题。我尝试了以下代码,但没有解决问题
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;
}
}
有什么想法吗?
无需更仔细地查看,我注意到的第一件事是您正在使用您的共享资源 -- _hasTexstChanged
在锁之外:
if(somecondition && !_hasTextChanged)
{
Dosomething();
}
您需要保护对跨线程共享资源的所有 访问(读取或写入):
Lock(thisLock)
{
if(somecondition && !_hasTextChanged)
{
Dosomething();
}
_hasTextChanged = false;
}