我有一些第三方类(由于某种原因)难以初始化。然后我想如果可以并行初始化它们,则可以减少加载时间。
这还好吗? 还是我没有考虑到某些问题? 我没有收到任何错误,但是我可以看到“其余代码”与正常初始化它们时输出的输出结果不同且错误。 可能是第三方类中的某些内容不希望并行初始化吗?
我有一个base class
和几个child class's
。在我的child Class's
内,是初始化第三方类的地方
我的代码如下:
public ChildClass1 test1;
public ChildClass2 test2;
private void button2_Click(object sender, EventArgs e)
{
Stopwatch MainWatch = new Stopwatch();
MainWatch.Start();
Task task1 = new Task(() => test1 = new ChildClass1());
task1.Start();
Task task2 = new Task(() => test2 = new ChildClass2());
task2.Start();
Task.WaitAll(task1, task2);
MainWatch.Stop();
//Rest of the code...
(编辑) 从评论即时消息中读取链接后,现在按以下所示方式进行操作。它正在工作,我获得了大约25%的加载时间。现在的问题是,它实际上是并行运行的吗?
public ChildClass1 test1;
public ChildClass2 test2;
private async void button2_Click(object sender, EventArgs e)
{
Stopwatch MainWatch = new Stopwatch();
MainWatch.Start();
await Task.Run(() => test1 = new ChildClass1());
await Task.Run(() => test2 = new ChildClass2());
await Task.WhenAll();
MainWatch.Stop();
//Rest of the code...
答案 0 :(得分:2)
难道是第三方类内部的某些东西不希望并行初始化吗?
好的。各种各样的事情。也许它不是线程安全的。看看您如何在UI应用程序中使用它,也许它包含UI元素,即使它们是线程安全的,那些也不喜欢在非UI线程中创建的元素。
只有您的第三方组件的供应商可以告诉您。向他们提供a Minimal, Complete, and Verifiable example,以便他们可以复制它。
答案 1 :(得分:0)
除了初始化可能确实不是线程安全的事实(只有供应商知道)之外,如果初始化确实花费了很长时间,那么并行化仍然不是最佳解决方案,因为仍然有很多工作要做。
不幸的是,您的示例非常通用。因此,目前尚不清楚您真正想做什么。如果要执行的工作非常繁琐,则可能不应该在单击按钮的过程中全部完成。单击应该仅触发操作,然后您可以在UI上显示一个负载指示器(例如,在工作进行时禁用按钮),最后在操作完成后执行您想做的所有事情。 / p>