Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# 泛型类型或对象类型的参数是线程安全的吗? [Webmethod] 公共静态字符串获取(列表输入1,字符串输入2) { Cust cu=Cust.CalAge(输入1,输入2) cu.agemodify=true; }_C#_Generics_Static_Thread Safety_Webmethod - Fatal编程技术网

C# 泛型类型或对象类型的参数是线程安全的吗? [Webmethod] 公共静态字符串获取(列表输入1,字符串输入2) { Cust cu=Cust.CalAge(输入1,输入2) cu.agemodify=true; }

C# 泛型类型或对象类型的参数是线程安全的吗? [Webmethod] 公共静态字符串获取(列表输入1,字符串输入2) { Cust cu=Cust.CalAge(输入1,输入2) cu.agemodify=true; },c#,generics,static,thread-safety,webmethod,C#,Generics,Static,Thread Safety,Webmethod,AJAX调用调用此Web服务 CalAge是类Cust中的一个静态方法 agemodify是类Cust中的boolean字段 我知道所有非静态字段/局部变量都有 即使在静态方法中,每个线程在堆栈上也有不同的副本。是 对吗?因此,这些是线程安全的,不是共享资源。 因此,agemodify是线程安全的吗 我的理解是,List作为参数是线程安全的 对于静态方法,因为对于int,不变性不适用。是 对吗?我知道list不是线程安全的。那就 s如果T是不可变的,则作为参数;如果T是不可变的,则作为对象 不变

AJAX调用调用此Web服务

CalAge
是类
Cust
中的一个静态方法

agemodify
是类
Cust
中的
boolean
字段

  • 我知道所有非静态字段/局部变量都有 即使在静态方法中,每个线程在堆栈上也有不同的副本。是 对吗?因此,这些是线程安全的,不是共享资源。 因此,agemodify是线程安全的吗
  • 我的理解是,
    List
    作为参数是线程安全的 对于静态方法,因为对于int,不变性不适用。是 对吗?我知道
    list
    不是线程安全的。那就
    s
    如果T是不可变的,则作为参数;如果T是不可变的,则作为对象 不变的e、 g.
    public static int GenMethod(),
    GetMethod(列表o1,对象o2)。
    仅对象vs
    列表。
    我不想使用System.Collections.Concurrent
  • 我的理解是,因为Webmethod是静态的,所以任何类 再往下的堆栈不需要实例化,因此, 也可以是静态的,因为只有一个Webmethod “实例”贯穿始终。对吗?有一个更好的选择吗 专用webservice(wcf/asmx)wrt线程安全,而不是静态 aspx页面上的webmethods

  • 不幸的是,你的问题太宽泛了。你似乎把几个不同的、完全不相关的概念混为一谈,好像它们以某种有意义的方式相互关联,尽管它们不是。我怀疑,在堆栈溢出回答的上下文中,是否有可能解开这里表示的所有误解

    也就是说,我会试试看。至少,我希望通过下面的内容,您可以获得足够的信息来回顾主要来源(如MSDN、其他文档)并纠正您的理解。在最好的情况下,也许下面的内容足以让你完全回到正轨

  • 我知道,即使在静态方法中,所有非静态字段/局部变量在每个线程的堆栈上都有不同的副本。对吗?因此,这些是线程安全的,不是共享资源。因此,agemodify是线程安全的吗
  • “这是对的吗?”-不,这简直是胡言乱语。方法中声明的局部变量有一个新实例,因此对于方法的每次调用,都有一个在方法中传递或初始化的值的新副本。因此,在局部变量的情况下,每次在不同的线程中调用该方法时,都会有新的副本,但这与线程无关。这都是关于方法调用的

    对于非静态字段,这些字段可能存储在堆栈†上,也可能不存储在堆栈†上,因此基于这些字段存储在堆栈上的假设得出的任何结论都必然是错误的。对于引用类型,只能为对象的每个实例获取一个新副本。对于值类型,您还可以为值类型的每个实例获取每个字段的新副本,但由于每次将值类型的新实例分配给新变量时都会获得一个新实例,因此可能会有更多副本。但同样,与线程无关,与堆栈无关(因为值类型可以存在于堆的堆栈上)

    “因此agemodify是线程安全的?”-没有足够的代码来回答这个问题。你需要为任何人提供一个好的答案来明确回答这个问题。如果
    Cust
    类型是引用类型,并且
    CalAge()
    方法总是创建该类型的新实例,或者
    Cust
    类型是值类型,那么我会说是的,该字段是线程安全的

    否则,不一定

    †就此而言,局部变量存储在堆栈上只是一个实现细节。正则局部变量不太可能改变,但C#中没有要求以这种方式处理它们。它们可以存储在任何地方,只要编译器保留局部变量的语义,事实上,这正是在C#中的各种上下文中发生的情况,例如捕获的局部变量,以及在迭代器方法和
    async
    方法等特殊方法中发现的局部变量

  • 我的理解是,
    List
    作为静态方法的参数是线程安全的,因为对于
    int
    不适用不变性。对吗?我知道
    List
    不是线程安全的。如果T是不可变的,那么只将
    s作为参数,如果对象是不可变的,那么它们又如何呢?e、 g.
    public static int GenMethod()
    GetMethod(列表o1,对象o2)
    。只需
    对象
    vs
    列表
    。我不想使用
    System.Collections.Concurrent
  • 再说一遍,所有这些都没有任何意义。
    input1
    变量是一个局部变量,它的值本质上是线程安全的,因为每次调用该方法都会有一个新的副本。但这只是一个变量。
    列表
    对象本身根本不受此影响,而且肯定不是线程安全的。只有当执行该方法的每个线程都获得
    List
    对象的唯一实例时,您才能说这是线程安全的

    至于类型参数
    T
    go的值,泛型并不能使它们本质上是线程安全的。就线程安全而言,
    T
    只是另一种类型。在编译泛型类型或方法时,您不知道类型这一事实与此无关,并且不会以任何方式帮助使该类型的值成为线程安全的

  • 我的理解是,因为Webmethod是静态的,所以堆栈后面的任何类都不需要实例化,因此也可以是stat
       [Webmethod]
    
         Public static string GetAge(List<int> input1, string input2)
         {
         Cust cu=Cust.CalAge(input1,input2)
         cu.agemodify=true;
    
         }