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

标签 c# multithreading task-parallel-library static-methods parallel.foreach

我的代码被 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/

相关文章:

c# - 如果超时没有完成任务,Task.Wait(int) 是否会停止任务?

c# - 使用 c#5.0 调用异步方法

c# - TPL 数据流加速?

c# - 是否可以在 C# 中覆盖分配 "="

c# - 编程策略——如何将对象向下传递到类链中

java - 在页面卸载时终止 java applet 线程

c# - 如何在每个循环周期中一步更新进度条? C#

c# - 无法在 WPF 中将菜单宽度设置为 100%。我的代码有什么问题?

c# - 可调整大小的控制用户的 WPF Adorner

c++ - 多线程应用程序中的槽执行策略