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)。如果我理解您试图解决的问题,我相信观察者模式可以解决它。从到目前为止的例子和讨论来看,您似乎正在试图找到解决方案。我可能错了。看看下面的链接,看看这是否为您提供了解决方案。您还需要阅读这篇关于静态变量和线程安全的文章。您试图做的不是线程安全的。