2016-02-19 2 views
0

У меня возникают проблемы с получением правильного синтаксиса для обеспечения того, чтобы мои переменные, которые совместно используются несколькими потоками, не мешают друг другу, но остаются локальными в потоке.C# Parallel.ForEach Синтаксис общих переменных

Я повторяю через datatable для определения нескольких переменных. Каждый поток будет полагаться на свой собственный набор нижеперечисленных переменных. Очевидно, что этот код перезаписывает переменный, когда начинается каждый поток:

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 затем используется позже другими классами на протяжении всей программы для каждого потока. До тех пор, пока поток не будет завершен, я должен поддерживать переменную local в каждом потоке.

К сожалению, у меня возникают трудности с примерами синтаксиса, например здесь, в 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; public string InterplayWatchFolder {get; задавать; } { get {return interplayWatchFolder; } set {interplayWatchFolder = значение; } } «Но когда мне нужно было получить переменную в другом классе, всегда было бы ясно, что нужно создать новый« 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); 
}