我在获取正确的语法方面遇到问题,以确保多个线程共享的变量不会相互干扰,但保留在线程本地。
我正在迭代数据表来定义多个变量。每个线程都依赖于它自己的以下变量集。显然,当每个线程开始时,这段代码会覆盖变量:
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 :(得分: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);
}