0

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

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

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

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

它似乎工作正常,但我不确定我是否做得对。有些东西告诉我,我的做法是错误的。我有吗?

4

2 回答 2

4

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

工作完成后,将BackgroundWorker引发其RunWorkerCompleted事件,您可以在 UI 线程上收听该事件。

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

于 2013-09-30T23:30:14.860 回答
1

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

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

于 2013-09-30T22:24:18.313 回答