解决 帮助Parallel.ForEach循环

半人马座

成员
已加入
2017年12月17日
留言内容
12
地点
休斯敦
编程经验
3-5
这是我第一次使用Parallel.ForEach循环,希望可以得到一些帮助。因此,基本上在Parallel.ForEach循环中,我正在进行单位覆盖,但是在下面的示例代码中,我只是将To / From单位串联起来,然后将其用于选择正确的转换公式。下面是一个例子。除了我正在显示的代码之外,还有更多的代码,但我认为不需要它来获得我正在寻找的帮助。
如果(tmp_cbox.Name =="P1_Units_CBox") 阻止是正确的,但是当 否则如果(tmp_cbox.Name =="Viscosity_Units_CBox") in re下面的d文本为true,出现以下错误:
消息=跨线程操作无效:控件'Viscosity_Type_CBox'是从创建该线程的线程之外的线程访问的。
为了提供更多细节,在导致错误的else-if块中,查看了两(2)个组合框。 Viscosity_Type_CBox组合框允许用户选择使用动态粘度还是运动粘度。然后,将更新Viscosity_Units_CBox组合框以包括基于Viscosity_Type_CBox选择的单位。

希望您能提供任何帮助,以使其正常工作并加深对错误原因的理解。我知道BackgroundWorker,但不确定如何使用它。如果有比BackgroundWorker更好的方法,请提出建议。谢谢!!


C#:
Parallel.ForEach(unit_list, unit =>
    // Call to Get_From_To_Unit_Concat with return of the To / From units concatenated
    tmp_concat_units = Get_From_To_Unit_Concat(pre_selected_unit, unit, unit_list, tmp_cbo);                 
});

//****************************************************************

private string Get_From_To_Unit_Concat(string temp_curr_unit, string unit, List<string> tmp_umits_list, ComboBox tmp_cbox)
{
    string pre_selected_unit = string.Empty;
    string post_selected_unit = string.Empty;
    List<string> get_cbo_list = new List<string>();   
    
    如果(tmp_cbox.Name =="P1_Units_CBox")
    {
        get_cbo_list = new List<string> { "psig", "psia", "barg", "bara", "kg_cm2_g", "kg_cm2_a", "kPa_g", "kPa_a", "in_wc_g", "mm_wc_g", "Pa_g", "Pa_a", "MPa_g", "MPa_a" };
    }
    [COLOR=rgb(184, 49, 47)]否则如果(tmp_cbox.Name =="Viscosity_Units_CBox")
    {
        if (Viscosity_Type_CBox.SelectedIndex == 0)
            get_cbo_list = new List<string> { "cP", "mPa_s", "lbm_ft_s", "kg_m_s", "Pa_s" };
        else if (Viscosity_Type_CBox.SelectedIndex == 1)
            get_cbo_list = new List<string> { "cSt", "SSU", "mm2_s", "ft2_s" };
    }[/COLOR]
    
    // code continues........
 
Solution
不要从辅助线程访问UI控件,而是先从控件中收集所需的数据(在Parallel.ForEach之前执行此操作),然后将其传递给工作程序。在您发布的代码中,除了其他参数之外,该方法还需要tmp_cbox.Name字符串和Viscosity_Type_CBox.SelectedIndex int值作为输入。您可以创建一个“ InputData”类,将必需品作为一个单元保存,因此您只需要一个输入参数。

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,073
地点
挪威
编程经验
10+
不要从辅助线程访问UI控件,而是先从控件中收集所需的数据(在Parallel.ForEach之前执行此操作),然后将其传递给工作程序。在您发布的代码中,除了其他参数之外,该方法还需要tmp_cbox.Name字符串和Viscosity_Type_CBox.SelectedIndex int值作为输入。您可以创建一个“ InputData”类,将必需品作为一个单元保存,因此您只需要一个输入参数。
 
解决方案

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
供将来参考,如果解决方案可以解决您的问题,请将其标记为解决方案,如果解决了,请标记为已解决。这使我们知道无需打开线程就不需要任何进一步的帮助,对于那些乐于助人的人来说,这可以节省时间。
 
最佳 底部