使用下面的代码,我如何知道我的线程是否已完成任务?我的目的是杀死那个线程以释放内存。或者我应该怎么做?
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"
});
}
答案 0 :(得分:1)
永远不要中止线程,除非你的过程终止病了并且无论如何都会死亡。发生了非常糟糕的事情(例如,不可挽回的锁)。代码很好,。当InitValues
方法结束时,线程也将结束。
如果InitValues
方法很简短,可以考虑ThreadPool
,否则考虑;离开吧。
你可能想要考虑添加一些异常处理,这样如果InitValues
抛出它就不会杀死整个AppDomain
,你应该理解大多数的时间用于更新UI线程上的UI(除非您的表是从外部源填充的,并且程序Rows.Add
只是说明性的。)
答案 1 :(得分:0)
一个选项是Thread.Join。这将使主线程在继续之前等待子线程完成执行。
另一个选项是查看System.ComponentModel.BackgroundWorker。它是MS提供的托管线程类。它会在完成后通知您。