确保线程在继续(使用任务)并使其休眠之前完成

时间:2013-09-30 22:08:39

标签: c#

我的程序有一个线程,可以根据用户输入执行命令。有时,命令可能需要一段时间才能运行。

所以我需要为长时间运行的任务启动一个线程,以便让用户继续工作。

在谷歌搜索了一下之后,我找到了任务,并制作了以下代码:

    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();
    }

似乎工作正常,但我不确定我是否做得对。有些东西告诉我,我接近了这个错误。我有吗?

2 个答案:

答案 0 :(得分:4)

听起来你想要像BackgroundWorker这样的东西。它有一个方法RunWorkerAsync(),导致其DoWork事件被抛出;所有DoWork的事件处理程序都在不同的线程中执行。

当工作完成后,BackgroundWorker会抛出其RunWorkerCompleted事件,您可以在UI线程上回听它。

同时,主表单应响应用户输入。如果您想要接受用户输入,您可以在调用RunWorkerAsync之前禁用所有控件,并在RunWorkerCompleted事件处理程序中重新启用它们。

答案 1 :(得分:1)

如果您的程序应该停止并等到任务完成,那么您不应该使用线程。而只需将光标更改为沙漏并在主线程中执行它。

除此之外,你可能想要评估为什么事情花了这么长时间,并确定应用程序是否真的应该坐在那里直到完成。