2016-02-19 20 views
0

我有问题得到正确的语法,以确保我的变量由多个线程共享不会互相干扰,但保持本地线程。C#Parallel.ForEach共享变量语法

我正在遍历一个数据表来定义多个变量。每个线程都依赖于它自己的一组下面的变量。显然,这代码重写变量每个线程开始时:

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)这里使用这种语法的例子,我无法将它应用于我的特定场景。

我想要的线程并行运行 - 任何语法的帮助将不胜感激。

+0

您需要为每个线程创建一个单独的'InterplaySetup'实例。看起来类是'static',所以它在所有线程中共享 – JRLambert

+0

你知道线程在'Parallel.ForEach'后面消失了。因此,当你说“然后在整个程序中为其他类使用后,每个线程”看起来有点不对。 – Enigmativity

回答

0

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

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

我没有原创的,但是当我试图从另一个类的那里获取变量值时,我将不得不创建一个新的InterplaySetup,然后清除该变量。例如,我有'私人字符串interplayWatchFolder;公共字符串InterplayWatchFolder {get;组; } { get {return interplayWatchFolder; } set {interplayWatchFolder = value; }但是,当我不得不在另一个类中获得变量时,由于创建了一个新的“InterplaySetup()”,它总是会清楚的。 –

+0

@RyanJensen你只是想创建一个新的,当你创建它们。如果你在循环之外需要它们,你必须将它们存储在一个集合中。 –

0

你将不得不为每一行创建一个实例,并添加到列表中,以便在以后的阶段访问的结果。

var interplaySetupList = new List<InterplaySetup>(); 

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

    interplaySetupList.Add(interplaySetup); 
}