确保线程在继续(使用任务)之前完成并使其进入睡眠状态
本文关键字:状态 继续 线程 确保 任务 | 更新日期: 2023-09-27 18:33:33
我的程序有一个根据用户输入执行命令的线程。有时,命令可能需要一段时间才能运行。
因此,我需要为长时间运行的任务启动一个线程,以便允许用户继续工作。
在谷歌搜索了一会儿后,我找到了任务,并制作了下面的代码:
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();
}
它似乎工作正常,但我不确定我是否做得对。有些事情告诉我,我走错了。我有吗?
听起来你想要像BackgroundWorker这样的东西。它有一个方法RunWorkerAsync()
导致引发其DoWork
事件;DoWork
的所有事件处理程序都在不同的线程中执行。
工作完成后,BackgroundWorker
会引发其RunWorkerCompleted
事件,你可以在 UI 线程上重新侦听该事件。
同时,主窗体应响应用户输入。如果不想接受用户输入,可以在调用 RunWorkerAsync
之前禁用所有控件,然后在 RunWorkerCompleted
事件处理程序中重新启用它们。
如果你的程序应该停止并等到任务完成,那么你不应该使用线程。 相反,只需将光标更改为沙漏并在主线程中执行它。
除此之外,您可能还需要评估为什么事情需要这么长时间,并确定应用程序是否真的应该坐在那里直到完成。