1

我有一个应用程序,它基本上做 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?

4

3 回答 3

3

使用后台工作者。

将构造的列表传递给 Completed 事件并将其分配给那里的 formclass 字段。

bList == null确保在适当的时候检查表格的其余部分。

于 2012-10-07T19:56:19.053 回答
2

您可以按照以下步骤在后台线程上生成 BinaryList:

  1. 创建一个调用 BinaryList 构造函数的方法

    private void getBinaryList()
    {
    bList = new BinaryList();
    } 
    
  2. 在执行任何其他操作之前在表单开始加载时启动新线程执行:

    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。

于 2012-10-07T20:24:58.163 回答
1

最简单的解决方案是使用任务

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班级可以使用任务来进行昂贵的初始化。

于 2012-10-08T06:22:01.143 回答