Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在执行异步编程时正确设置变量_C#_Multithreading - Fatal编程技术网

C# 在执行异步编程时正确设置变量

C# 在执行异步编程时正确设置变量,c#,multithreading,C#,Multithreading,我有一个模型,它有一个属性 public static class CheckerClass { public static bool checkFlag { get; set; } } 我有一个设置上述属性的方法 public async Task test() { checkFlag = true; await SomeotherService1.Method1(); } SomeotherService1.cs Method1(){ SomeotherSer

我有一个模型,它有一个属性

public static class CheckerClass
{
    public static bool checkFlag { get; set; }
}
我有一个设置上述属性的方法

public async Task test()
{
    checkFlag = true;
    await SomeotherService1.Method1();
}
SomeotherService1.cs

Method1(){
  SomeotherService2.Method2(somedata);
}
//有更多的调用要到达
Method5()
,因此我无法发送属性以查看它是否是从
test()
调用的

SomeotherService5.cs

Method5(SomeModel someData)
{
    if(checkFalg)
    {
        checkFlag = false;
        //execute methods
    }
    else
    {
        //execute some other methods
    }
}
我有一些线程同时运行
test()
Method()
[假设线程1] 以及一些只运行
Method()
[假设线程2]的线程

当thread1运行时,它将
检查标志设置为true,并将执行
方法()
中的if条件

但是,当thread2同时运行时,
checkFlag
仍然为true,这是不正确的。我该如何解决这个问题


thread2应始终具有
checkFlag=false

如果我理解正确,您应该同步对flag属性的访问。这可以通过多种方式完成,但最简单的可能是一个简单的锁:

创建同步字段:

private readonly object _sync = new object();
然后进行如下检查:

lock(_sync)
{
    if(checkFlag)
         return;
    checkFlag = true;
}
编辑:重读你的问题,我不确定我是否正确理解你的要求。尤其是“thread2应该始终具有checkFlag=false”;而且您将checkFlag作为模型的属性,但您在任何地方都使用它,这让我感到困惑。您的
方法是否应该只包含另一个变量?你提出问题的方式似乎与线程问题无关?做

public async Task test(){
    await SomeotherService.Method(someData, true);
 }
SomeotherService.cs

Method(SomeModel someData, bool check = false){
    if(check ){
       //execute methods
    }
    else{
       //execute some other methods
    }
 }

我们可以看到包含checkFlag的完整模型定义吗?这个类标记为静态吗?@Matt是的,它是静态的static@Matt我已经编辑了我的问题。请现在检查一下,我看不出你想做什么。我真的怀疑你混淆了两个概念:线程和OOP。我的意思是,如果你想让一个属性在它自己的上下文中有一些值(不管是线程还是其他什么),我想你应该实例化一个新的实例并在该实例上运行你的方法(或者传递一个表示某种状态的对象)。这样,就满足了线程1和线程2的要求。静态属性一次将有1个值,而不管访问它的线程是什么。我编辑了我的问题,我没有直接从
method1()
调用
method2()
,因此我无法在每个方法中发送属性,并在最后一个
method()中检查它
。我想创建一个变量,该变量由automation进行的一些调用设置为true,默认值应为false。如果automation调用将标志设置为true,同时又有另一个调用进入,那么它不应该将标志设置为true,而是默认值(false)。如果我理解您试图解决的问题,我相信观察者模式可以解决它。从到目前为止的例子和讨论来看,您似乎正在试图找到解决方案。我可能错了。看看下面的链接,看看这是否为您提供了解决方案。您还需要阅读这篇关于静态变量和线程安全的文章。您试图做的不是线程安全的。