2012-10-07 98 views
1

我有一个应用程序,它基本上没有2个作业:如何使用多线程在C#构造函数

一)解析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

使用Backgroundworker。

传递建构列表已完成的事件,并将其分配给formclass场那里。

确保您的形式检查bList == null的其余部分在适当的时候。

+1

我很抱歉,我没有得到你 - 你能PL与示例代码详细点吗? –

+1

你可以用完整的单词吗? –

+0

你已经看过“Backgroundworker”吗? –

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。

+0

谢谢。我得到这个错误“开始索引不能小于零”,参数名称=“StartIndex”。在运行我的应用程序时,我不明白这个警告(或错误)。能否请你帮忙? –

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

+0

此处的问题是=> bList不是作为Binarylist创建的,而是创建为Task对象。因此,我无法访问使用bList的类成员,这给我错误。 –

+0

正如上面的代码所显示的那样 - 您可以通过任务的Result属性获取实际列表。然后你可以用通常的方式访问班级成员。 –