gpt4 book ai didi

c# - 通过多线程调用静态方法 - 它们可以干扰彼此的输入参数吗

转载 作者:行者123 更新时间:2023-11-30 15:26:53 25 4
gpt4 key购买 nike

我的代码被 AJAX UI(多线程)调用,并在数据处理后以 Json 格式发送输出。最近在重构代码时,我们将许多常用和重复的方法转移到一个单独的文件中,我们将它们设为静态,因为我们不处理任何静态/共享数据。以下是我们的静态方法的示例设计:

public class Helper
{
public static C Method1(List<A> aList, List<B> bList)
{
C objC = new C();

// Create ObjC based on inputs aList and bList

return objC;
}
}

现在,我的理解是以下调用不会有问题,在Parallel.foreach 或任何其他多线程场景中调用时,请验证。

C resultC = Helper.Method1(aList, bList);

但是我们有疑问,是否存在一种罕见的情况,即两个线程进行上述调用,一个线程的 aList、bList 数据被另一个线程替换,从而给出有缺陷的结果(可能是异常),这can for that matter 将不可能调试和重复,因为两个线程必须在方法执行所需的精确毫秒内一起去/执行

请分享您的观点,我们是否在正确的轨道上创建上述设计,或者存在我们无法看到的坑。我们可以很容易地用实例方法替换,在这种情况下它们肯定是线程安全的,因为每个线程都有自己的实例可以使用,但我觉得可能不需要并且继续创建实例很麻烦,当我们可以方便地使用时静态调用。

请注意,到目前为止我还没有看到代码运行的问题,但正如我所说,如果发生这种情况,那将是极端情况,因为两个线程同时出现,一个线程替换输入参数,而另一个线程仍在处理结果。

最佳答案

对您的问题的简短回答是,只要您在所有不同的线程中传递不同的List 实例即可。 .NET 可以很好地处理线程,并且本身不会陷入困惑,只有当您的代码鼓励它这样做时,事情才会变得困惑。

事情变得困惑的方式是在不同线程之间共享状态。因此,举个例子,如果你有一个静态方法,你可能会认为在某处使用静态变量是个好主意:

private static int count;

public static void MyMethod() {
count = count + 1;
if(count == 5) {
console.log("Equal to 5");
}
};

这种方法不是线程安全的,因为count可以同时被两个不同的线程修改。事实上,count 可能会增加到 5,然后另一个线程在 if 检查之前将它增加到 6,因此您永远不会记录任何内容 - 这显然会有点困惑。

您可以共享状态的另一种方式是,如果您传入某些内容,因此我在答案开头的警告。如果您将同一个对象从多个线程传递到方法中,则该对象理想情况下应为 immutable。所以在你的情况下是一个无法修改的集合。这可以防止方法的内部修改可能影响另一个线程的对象。正如已经提到的,只有在不同线程中传递相同的实例时,这才是一个问题。

关于c# - 通过多线程调用静态方法 - 它们可以干扰彼此的输入参数吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28361661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com