我有一个基本上可以完成2个工作的应用程序:
a)解析XML(大量内容)并序列化/反序列化 一个类对象,它对数据进行一些数学运算 获得
b)通过解析许多文件/目录来填充UI。
两者都是独立的任务。 由于执行时间很长,我想在我的表单中使用多线程,我调用另一个类的构造函数(执行XML解析和操作)。 你能指导一下如何做到这一点吗?
public partial class Form1: Form
{
public Binarylist bList = new Binarylist(); //parses the XML and does multiple operations
........
.......
private Form1_Load(object sender, EventArgs e)
{
........ //populates UI by parsing files & directories
}
我的问题在这里 - 我如何多线程Binarylist构造函数,以便我也在主线程上并行执行form1_load?
答案 0 :(得分:3)
使用背景工作者。
将构造的列表传递给Completed事件并将其分配给那里的formclass字段。
确保表单的其余部分在适当时检查bList == null
。
答案 1 :(得分:2)
您可以按照以下步骤在后台线程上生成BinaryList:
为其创建一个方法来调用BinaryList构造函数
private void getBinaryList()
{
bList = new BinaryList();
}
在执行表单开始加载之前启动新线程执行:
private Form_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(getBinaryList));
t.Start();
// do your stuff
t.Join();
//this ensures both threads complete before event execution finishes
}
如果这两个作业都很耗时,我建议不要锁定UI线程,因为你的应用程序会变得没有响应,所以我会在后台线程上执行这两个,然后更新你的UI。
答案 2 :(得分:1)
最简单的解决方案是使用tasks:
public partial class Form1: Form
{
private readonly Task<Binarylist> bList =
Task.Factory.StartNew(() => new Binarylist());
private Form1_Load(object sender, EventArgs e)
{
// Get the result of the task when needed
var constructedList = bList.Result;
// ...
}
}
访问Task.Result
将等待构造完成,然后为您提供完全构造的对象。可以说,你的Binarylist
类可以使用任务进行昂贵的初始化。