Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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# 通过ParameteredThreadStart按值(非引用)传递参数_C#_Multithreading_Visual Studio - Fatal编程技术网

C# 通过ParameteredThreadStart按值(非引用)传递参数

C# 通过ParameteredThreadStart按值(非引用)传递参数,c#,multithreading,visual-studio,C#,Multithreading,Visual Studio,我试图通过以下方式将参数(复制而非引用)传递给线程: Thread thread = new Thread(new ParameterizedThreadStart(DoMethod)); thread.start(concurrentQueueObj); 但我注意到它是通过引用传递的。同样的答案是“BlueM” 知道如何通过复制将参数传递给线程吗?我非常感谢你的帮助 编辑:我只希望该线程接收参数的副本。这样,如果主线程更改concurrentQueueObj,它对工作线程的参数没有影响。我理

我试图通过以下方式将参数(复制而非引用)传递给线程:

Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));
thread.start(concurrentQueueObj);

但我注意到它是通过引用传递的。同样的答案是“BlueM”

知道如何通过复制将参数传递给线程吗?我非常感谢你的帮助


编辑:我只希望该线程接收参数的副本。这样,如果主线程更改concurrentQueueObj,它对工作线程的参数没有影响。

我理解您的问题,尽管您使用了错误的词

您不是通过引用传递
concurrentQueueObj
变量,而是传递作为引用的
concurrentQueueObj
变量的值

简而言之,您传递的是引用,而不是引用

如果你想阅读更多关于这个主题的文章,我相信你可以在互联网上找到很多文章,也可以在Stack Overflow上找到高质量的问题和答案。你可以从阅读Jon Skeets的文章开始

通过引用传递将使用
ref
out
关键字,在C#的更高版本中,使用
in
关键字

然而,据我所知,问题是:

我是否可以将
concurrentQueueObj
对象的副本传递给线程,以便在它或我(启动线程的代码)修改该对象之后,该对象不会泄漏到不同的线程中

一般来说,答案是否定和肯定

C#编程语言或.NET运行时和库平台中没有一般性的东西可以解决这个问题

然而,你能做的就是自己复制一份,然后把它传给别人。具体如何做完全取决于传入的对象的类型。例如,如果它是一个
列表
,您只需对其调用
.ToList()
,就可以得到一个新列表

但是,您不会获得列表中所有对象的副本。这些仍将在原始列表和副本之间共享

唯一100%万无一失的“复制方法”是创建对象的深度副本,这意味着您克隆/复制其中包含的每个对象

有许多数据结构,都内置在.NET中,并作为NuGet包提供,它们旨在以不同的方式解决部分问题,例如不可变的数据结构和集合,等等。以下哪项适用于您的场景取决于该变量的类型


如果您想了解更多有关传递引用与按引用传递引用的信息,在.NET和C#中,此问题有两个轴:

  • 值类型(值)
  • 引用类型(引用虽然是引用变量的值,但却是引用)
以及:

  • 参照传递
  • 按值传递
您将这两个轴的所有组合组合在一起,因此,如果您想了解更多有关这一点的信息,请务必了解它对以下方面的意义:

  • 按值传递值类型

    哪个是副本

  • 通过引用传递值类型

    它是一个引用指针,指向保存该值的变量 类型

  • 通过值传递引用类型

    它是引用的副本,但不是它引用的对象

  • 通过引用传递引用类型

    这是对保存引用类型的变量的引用


    • 尽管你用错了词,但我理解你的意思

      您不是通过引用传递
      concurrentQueueObj
      变量,而是传递作为引用的
      concurrentQueueObj
      变量的值

      简而言之,您传递的是引用,而不是引用

      如果你想阅读更多关于这个主题的文章,我相信你可以在互联网上找到很多文章,也可以在Stack Overflow上找到高质量的问题和答案。你可以从阅读Jon Skeets的文章开始

      通过引用传递将使用
      ref
      out
      关键字,在C#的更高版本中,使用
      in
      关键字

      然而,据我所知,问题是:

      我是否可以将
      concurrentQueueObj
      对象的副本传递给线程,以便在它或我(启动线程的代码)修改该对象之后,该对象不会泄漏到不同的线程中

      一般来说,答案是否定和肯定

      C#编程语言或.NET运行时和库平台中没有一般性的东西可以解决这个问题

      然而,你能做的就是自己复制一份,然后把它传给别人。具体如何做完全取决于传入的对象的类型。例如,如果它是一个
      列表
      ,您只需对其调用
      .ToList()
      ,就可以得到一个新列表

      但是,您不会获得列表中所有对象的副本。这些仍将在原始列表和副本之间共享

      唯一100%万无一失的“复制方法”是创建对象的深度副本,这意味着您克隆/复制其中包含的每个对象

      有许多数据结构,都内置在.NET中,并作为NuGet包提供,它们旨在以不同的方式解决部分问题,例如不可变的数据结构和集合,等等。以下哪项适用于您的场景取决于该变量的类型


      如果您想了解更多有关传递引用与按引用传递引用的信息,在.NET和C#中,此问题有两个轴:

      • 值类型(值)
      • 引用类型(引用虽然是引用变量的值,但却是引用)
      以及:

      • 参照传递
      • 按值传递thread.start(concurrentQueueObj); concurrentQueueObj = null;
        thread.start(concurrentQueueObj);
        concurrentQueueObj.Enqueue(someData);