我的程序有一个线程,可以根据用户输入执行命令。有时,命令可能需要一段时间才能运行。
所以我需要为长时间运行的任务启动一个线程,以便让用户继续工作。
在谷歌搜索了一下之后,我找到了任务,并制作了以下代码:
private Thread t_Thread;
private void startTask()
{
Console.WriteLine("Starting");
Task t = Task.Factory.StartNew(() =>
{
for (int i = 0; i <= 4; i++)
{
Console.WriteLine(i);
Thread.Sleep(500); // Is this right?
}
});
Task.WaitAny(t);
Console.WriteLine("Ending");
}
private void button1_Click(object sender, EventArgs e)
{
t_Thread = new Thread(() => startTask());
t_Thread.Start();
}
似乎工作正常,但我不确定我是否做得对。有些东西告诉我,我接近了这个错误。我有吗?
答案 0 :(得分:4)
听起来你想要像BackgroundWorker这样的东西。它有一个方法RunWorkerAsync()
,导致其DoWork
事件被抛出;所有DoWork
的事件处理程序都在不同的线程中执行。
当工作完成后,BackgroundWorker
会抛出其RunWorkerCompleted
事件,您可以在UI线程上回听它。
同时,主表单应响应用户输入。如果您不想要接受用户输入,您可以在调用RunWorkerAsync
之前禁用所有控件,并在RunWorkerCompleted
事件处理程序中重新启用它们。
答案 1 :(得分:1)
如果您的程序应该停止并等到任务完成,那么您不应该使用线程。而只需将光标更改为沙漏并在主线程中执行它。
除此之外,你可能想要评估为什么事情花了这么长时间,并确定应用程序是否真的应该坐在那里直到完成。