我怎么知道我的线程是否已完成任务? (C#winforms)

时间:2010-09-29 06:26:07

标签: c# winforms multithreading

使用下面的代码,我如何知道我的线程是否已完成任务?我的目的是杀死那个线程以释放内存。或者我应该怎么做?

private delegate void DelegateSetProperties(DataTable dataSource, string valueMember, string displayMember);

    Thread thread1;
    DelegateSetProperties delegateSetProperties;

    private void Form1_Load(object sender, EventArgs e)
    {
        delegateSetProperties = new DelegateSetProperties(SetProperties);

        thread1 = new Thread(new ThreadStart(InitValues));
        thread1.IsBackground = true;
        thread1.Start();
        // should I abort thread1 here? if I abort it, does it frees the memory occupied by thread1?
    }

    private void SetProperties(DataTable dataSource, string valueMember, string displayMember)
    {
        comboBox1.DataSource = dataSource;
        comboBox1.ValueMember = valueMember;
        comboBox1.DisplayMember = displayMember;
        comboBox1.SelectedIndex = 0;
    }      

    void InitValues()
    {
        var dt = new DataTable
                {
                    TableName = "CATEGORY",
                    Columns = {
                                {"CategoryCode", typeof(string)},
                                {"Name", typeof(string)},
                              }
                };

                dt.Rows.Add("C1", "Category1");
                dt.Rows.Add("C2", "Category2");
                dt.Rows.Add("C3", "Category3");
                // and so on...
        comboBox1.Invoke(delegateSetProperties, new object[] { dt, "CategoryCode", "Name" 

});
    }

2 个答案:

答案 0 :(得分:1)

永远不要中止线程,除非你的过程终止病了并且无论如何都会死亡。发生了非常糟糕的事情(例如,不可挽回的锁)。代码很好。当InitValues方法结束时,线程也将结束。

如果InitValues方法很简短,可以考虑ThreadPool,否则考虑;离开吧。

可能想要考虑添加一些异常处理,这样如果InitValues抛出它就不会杀死整个AppDomain,你应该理解大多数的时间用于更新UI线程上的UI(除非您的表是从外部源填充的,并且程序Rows.Add只是说明性的。)

答案 1 :(得分:0)

一个选项是Thread.Join。这将使主线程在继续之前等待子线程完成执行。

另一个选项是查看System.ComponentModel.BackgroundWorker。它是MS提供的托管线程类。它会在完成后通知您。