C#Parallel.ForEach共享变量语法

时间:2016-02-19 22:19:26

标签: c# multithreading

我在获取正确的语法方面遇到问题,以确保多个线程共享的变量不会相互干扰,但保留在线程本地。

我正在迭代数据表来定义多个变量。每个线程都依赖于它自己的以下变量集。显然,当每个线程开始时,这段代码会覆盖变量:

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(https://msdn.microsoft.com/en-us/library/dd460703(v=vs.110).aspx)上的语法示例有困难,我无法将其应用到我的特定场景中。

我希望线程并行运行 - 对语法的任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:0)

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

Parallel.ForEach(iterate.AsEnumerable(), drow =>
{
    var interplaySetup = new InterplaySetup(); //Or copy from shared template
    interplaySetup.<> // access specific variable
}

答案 1 :(得分:0)

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

var interplaySetupList = new List<InterplaySetup>();

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

  interplaySetupList.Add(interplaySetup);
}