标签需要很长时间才能改变

时间:2014-05-20 07:35:13

标签: c# winforms

我的C#中的winform应用程序出了问题。 在程序中,我有一个标签作为状态栏和这样的方法:

private void btnProcess_Click(object sender, EventArgs e)
{
    lblStatus.Text = "Please wait...";
    /*
    Code here
    */
}

我的代码过程需要几秒钟但在处理完代码后,标签文本会发生变化,我希望它在此之前发生。

注意:我是编程的业余爱好者,我不能很好地理解英语,请简单解释一下你的解决方案。谢谢。

4 个答案:

答案 0 :(得分:3)

您可以通过调用更新或刷新使用重绘事件来破解此操作,但真正的解决方案是使用BackgroundWorker进行更长时间的操作。

这不容易,你应该用你理解的语言找到它的教程。

答案 1 :(得分:0)

在winform应用程序中(但也在所有GUI应用程序中),不推荐在GUI线程中执行长任务。要解决您的问题,您必须使用线程(here,您可以找到完整的mdsn参考) 如果你想从另一个线程更新标签,你可以我将进行交叉线程操作。有关详细信息,请查看此question

答案 2 :(得分:0)

在对UI进行任何更改之前,始终运行并完成所有代码。这只是WinForms和WPF的基本逻辑。

您可以使用" BackgroundWorker" ,因此较长的代码会在另一个线程上运行。这样,您可以在较长的代码仍在运行时自由编辑UI元素。

答案 3 :(得分:0)

如果您使用的是.Net 4.5,则可以使用awaitasync而不是BackgroundWorker

您将创建一个返回任务的async方法,并在该方法中使用Task.Run()开始后台工作。

这是一个例子。你在传递给Task.Run()的lambda中做了所有缓慢的工作,在那里我评论说“你们在这里做的都很慢”:

private async void btnProcess_Click(object sender, EventArgs e)
{
    lblStatus.Text = "Please wait...";

    await doSomeWorkAsynchronously();

    lblStatus.Text = "Work completed";
}

private async Task doSomeWorkAsynchronously()
{
    await Task.Run(()=>
    {
        // Do all your slow work here.
        Thread.Sleep(5000); // Simulate slow work.
    });
}

我认为这比使用BackgroundWorker更容易。

请注意,如果所有“慢”方法都已async(例如,如果您使用asynchronous file I/O),那么您可能只能await每个异步操作而不是必须通过Task.Run()创建自己的任务。

您还可以从后台任务返回值。假设您想要在后台任务完成时返回一个字符串,用于更新标签。你可以这样做:

private async void btnProcess_Click(object sender, EventArgs e)
{
    lblStatus.Text = "Please wait...";
    lblStatus.Text = await doSomeWorkAsynchronously();
}

private async Task<string> doSomeWorkAsynchronously()
{
    return await Task.Run(()=>
    {
        // Do all your slow work here.
        Thread.Sleep(5000); // Simulate slow work.
        return "The task completed.";
    });
}
相关问题