如果在C#中检查bool值,那么直接对其求反是否是一种良好的做法/线程安全?
我问自己是否可以编写一个如果在C#中检查bool值,那么直接对其求反是否是一种良好的做法/线程安全?,c#,multithreading,if-statement,conditional-statements,C#,Multithreading,If Statement,Conditional Statements,我问自己是否可以编写一个if语句来检查bool变量,然后在进入语句体之前直接更改其值 因此,与其写作 if(getNextImage) { getNextImage=false; //多做点事 } 我试过这个 if(getNextImage?!(getNextImage=false):false) { //多做点事 } 这起作用了 这样做的原因是代码同时在多个线程中运行,我想确保if块只在代码中到达该行的第一个线程中执行一次 我的问题是:这种方法是一种良好的做法吗?它会按照我的预期工作吗?如
if
语句来检查bool变量,然后在进入语句体之前直接更改其值
因此,与其写作
if(getNextImage)
{
getNextImage=false;
//多做点事
}
我试过这个
if(getNextImage?!(getNextImage=false):false)
{
//多做点事
}
这起作用了
这样做的原因是代码同时在多个线程中运行,我想确保if块只在代码中到达该行的第一个线程中执行一次
我的问题是:这种方法是一种良好的做法吗?它会按照我的预期工作吗?如果没有,除了锁定之外还有其他方法吗?我假设您打算更改全局变量的值,如果它满足您的条件。 你会因为你认为的原因而出现问题,这会让很多用户感到困惑。
作为一种解决方案,您可以使用Lock(),也可以创建一个异步方法(),这会更好(锁可能会使应用程序变慢)。对于线程安全,问题通常归结为避免。不幸的是,在这方面,您的代码没有提供任何保护 正如另一篇帖子所说,lock语句是一种方法。通常,创建对象“互斥体”的唯一目的是锁定
object mutex = new object();
lock (mutex){
//the code that can not run in parallel
}
在您的案例中,有两个原因:
bool LocalGetNextImage = false;
lock(mutex){
if(GlobalGetNextImage){
GlobalGetNextImage = false;
LocalGetNextImage = true;
}
}
这将很快释放锁,同时仍然给予线程读取和写入值的独占权限。并且有一个布尔值供以后使用。不,它不会按您希望的方式工作
//多做一些事情
可能不止一次。通常,对于线程情况,锁定
或联锁
应该是您的解决方案。这两个代码段都不是线程安全的。值可以很容易地从表达式更改到下一个表达式。要么将块包装在锁中,要么在单个原子操作中使用来比较和替换值您想做什么?有更好的方法来协调执行。例如,您可以使用ActionBlock或Channel将工作发布到辅助函数async关键字不会使任何内容异步运行,也不会协调异步操作。它只是一种语法糖,允许await关键字在不阻塞的情况下等待已经运行的异步操作