如何在C#中使用多线程作为构造函数

时间:2012-10-07 19:46:28

标签: c# multithreading constructor

我有一个基本上可以完成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?

3 个答案:

答案 0 :(得分:3)

使用背景工作者。

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

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

答案 1 :(得分: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
    }
    
  3. 如果这两个作业都很耗时,我建议不要锁定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类可以使用任务进行昂贵的初始化。