Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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#Parallel.ForEach共享变量语法_C#_Multithreading - Fatal编程技术网

C#Parallel.ForEach共享变量语法

C#Parallel.ForEach共享变量语法,c#,multithreading,C#,Multithreading,我在获取正确的语法以确保多个线程共享的变量不会相互干扰,而是保持线程的局部性时遇到问题 Parallel.ForEach(iterate.AsEnumerable(), drow => { var interplaySetup = new InterplaySetup(); //Or copy from shared template interplaySetup.<> // access specific variable } 我正在遍历一个数据表来定义多个

我在获取正确的语法以确保多个线程共享的变量不会相互干扰,而是保持线程的局部性时遇到问题

Parallel.ForEach(iterate.AsEnumerable(), drow =>
{
    var interplaySetup = new InterplaySetup(); //Or copy from shared template
    interplaySetup.<> // access specific variable
}
我正在遍历一个数据表来定义多个变量。每个线程都依赖于它自己的一组变量。显然,此代码会在每个线程开始时覆盖变量:

Parallel.ForEach(iterate.AsEnumerable(), drow =>
         //foreach (DataRow drow in iterate.Rows)
 {
    //Set Variables
    string insertDeliniator = "/"; //extra needed to build URI
    string insertInterplay = "interplay://"; //extra info needed to build URI

    InterplaySetup.InterplayEngineHostname = drow["Interplay_Engine_Hostname"].ToString();
    InterplaySetup.InterplayWatchFolder = insertInterplay + drow["Interplay_Engine_Hostname"].ToString() + insertDeliniator + drow["Interplay_Watch_Folder"].ToString();
    InterplaySetup.SafeForTranscodingFolder = insertInterplay + drow["Interplay_Engine_Hostname"].ToString() + insertDeliniator + drow["Interplay_Safe_Folder"].ToString();
    InterplaySetup.SafeForTranscodingSubmitURI = "interplay://Interplay/" + drow["Interplay_Safe_Folder"].ToString();
    InterplaySetup.TransferEngineHostname = drow["Transfer_Engine_Hostname"].ToString();
    InterplaySetup.TransferPlaybackDevice = drow["Transfer_Profile"].ToString();
    InterplaySetup.TranscodingProfile = drow["Transcoding_Profile"].ToString();
}
InterplaySetup类中的变量值随后被程序中的其他类用于每个线程。在线程完成之前,我必须将变量保持为每个线程的局部变量

不幸的是,我在MSDN()上的语法示例中遇到了困难,无法将其应用到我的特定场景中


我希望线程能够并行运行-如果您能提供语法方面的任何帮助,我们将不胜感激。

您需要在线程上下文中创建变量

Parallel.ForEach(iterate.AsEnumerable(), drow =>
{
    var interplaySetup = new InterplaySetup(); //Or copy from shared template
    interplaySetup.<> // access specific variable
}
Parallel.ForEach(iterate.AsEnumerable(),drow=>
{
var interplaySetup=new interplaySetup();//或从共享模板复制
interplaySetup//访问特定变量
}

您必须为每一行创建一个实例并添加到列表中,以便在以后的阶段访问结果

var interplaySetupList = new List<InterplaySetup>();

Parallel.ForEach(iterate.AsEnumerable(), drow =>
{
  var interplaySetup = new InterplaySetup {
    InterplayEngineHostname = drow["Interplay_Engine_Hostname"].ToString(),
    ...
  };

  interplaySetupList.Add(interplaySetup);
}
var interplaySetupList=newlist();
Parallel.ForEach(iterate.AsEnumerable(),drow=>
{
var interplaySetup=新interplaySetup{
InterplayEngineHostname=drow[“Interplay\u Engine\u Hostname”]。ToString(),
...
};
interplaySetup.Add(interplaySetup);
}

您需要为每个线程创建一个单独的
InteractiveSetup
实例。该类看起来是
静态的
,因此它在所有线程之间共享。您知道在
并行.ForEach
之后线程消失。因此,当您说“以后在整个程序中为每个线程由其他类使用”时这似乎有点错误。我确实有,但当我试图在另一个类中从那里获取变量值时,我必须创建一个新的InterplaySetup,然后清除变量。例如,我有“private string interplayWatchFolder;public string interplayWatchFolder{get;set;}{get{return interplayWatchFolder;}set{interplayWatchFolder=value;}}}但是当我必须在另一个类中获取变量时,由于创建了一个新的'InterplaySetup(),它总是会被清除“.@RyanJensen您只想在创建它们时创建一个新的。如果您需要它们在循环之外,则必须将它们存储在集合中。