Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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#_.net_Thread Safety - Fatal编程技术网

C# 列表变量在我的代码中是线程安全的吗

C# 列表变量在我的代码中是线程安全的吗,c#,.net,thread-safety,C#,.net,Thread Safety,我有下面的静态类。规则是一种自定义类型。请确认此方法对于我正在传递给每个生成规则的静态函数的变量listToUpdate是线程安全的 public static class RulesBO { public static List<Rule> GetRulesForTransaction(int transID) { List<Rule> toReturn = new List<Rule>(); GetRules

我有下面的静态类。规则是一种自定义类型。请确认此方法对于我正在传递给每个生成规则的静态函数的变量listToUpdate是线程安全的

public static class RulesBO
{
    public static List<Rule> GetRulesForTransaction(int transID)
    {
        List<Rule> toReturn = new List<Rule>();
        GetRulesForSetA(transID,toReturn);
        GetRulesForSetB(transID,toReturn);
    }

    public static void GetRulesForSetA(int transID, List<Rule> listToUpdate)
    {
        /*business logic and finally add/remove elements from listToUpdate*/

    }

    public static void GetRulesForSetB(int transID, List<Rule> listToUpdate)
    {
        /*business logic and finally add/remove elements from listToUpdate*/

    }
}
谢谢你的帮助

编辑: 将从ASP.NET调用类RulesBO。因此,对于每个会话,对于用户的transactionID,将调用GetRulesForTransaction方法以返回规则列表

每个GetRulesForSetXYZ将对特定transID进行DB调用,获取一些值,执行一些检查,如100、>1000等,然后向变量添加一个新的规则实例。其他方法将是私有的,只有第一个方法是公共的。

因为您声明:

每个GetRulesForSetXYZ[…]都是私有的,只有第一个方法是公共的


这意味着,即使同时从几个不同的线程调用entry方法,每个调用都有自己的列表。这些列表中的每一个都只能从单个线程访问,至少在它们返回之前是这样,因此您没有任何多线程访问来同步,因此不存在争用条件。

这里没有同步-这肯定不是线程安全的。您需要具体说明您正在执行的操作以及您希望它执行的操作。有鉴于此,您的代码可能会也可能不会满足您自己的期望。目前我们不知道你的代码在做什么,也不知道你期望它做什么。简短回答:不知道。列表本身不是线程安全的。但是,从前面的演示来看,您并没有在异步线程或任何其他线程上执行任何操作,因此都在同一个线程上。其他方法将是私有的,只有第一个方法是公共的。然而,您在示例中公开了它们……如果不知道如何从不同线程调用这些GetRules方法,就无法知道。如果从两个不同的线程调用GetRulesForTransaction,则会得到两个单独的列表,并且线程之间没有交互。但是,如果您没有向我们展示的业务逻辑在某种程度上不是线程安全的,或者您正在使用相同的GetRules列表或从不同的线程修改它,那么它可能不是线程安全的。感谢您确认Servy。但是他的业务逻辑很容易以线程不安全的方式使用列表。@Sylverfy确实,这段代码与他给我们看的代码完全无关,这段代码也不受使用方式的影响。如果他的程序有问题,那不是他给我们看的代码的结果。