C#进度条值为时标签文本不更新

C#进度条值为时标签文本不更新,c#,C#,在C#中,我尝试制作一个小游戏类型的程序,我尝试制作一个使用进度条的加载条,文本使用标签,例如进度条为1-25,我希望在进度条为时更新标签文本,以下是一个示例: private void惊人加载\u单击(对象发送者,事件参数e) { 主进度条。最大值=25; int P=0; 而(P{ LoadingText.Text=value+“/”+max; MainProgressBar.Value=值; }); var progress=progressHandler作为IProgress; 等待任

在C#中,我尝试制作一个小游戏类型的程序,我尝试制作一个使用进度条的加载条,文本使用标签,例如进度条为1-25,我希望在进度条为时更新标签文本,以下是一个示例:

private void惊人加载\u单击(对象发送者,事件参数e)
{
主进度条。最大值=25;
int P=0;
而(P<25)
{
//耽搁
系统线程线程睡眠(130);
//增加进展
P++;
//设置进度条值
MainProgressBar.Value=P;
//在进度条上方设置文本
LoadingText.Text=P+“/25”;
}
}

另外,我不想要太大的代码,我希望它像这样简单

最先进的是这段代码:

private void StartLoading_Click(object sender, EventArgs e)
    {
        const int max = 25;
        var progressHandler = new Progress<int>(value=>{
            LoadingText.Text = value + "/" + max;
            MainProgressBar.Value = value;
        });

        var progress = progressHandler as IProgress<int>;
        await Task.Run(() =>
        {
           int P = 0;
           while (P < 25)
           {
              Thread.Sleep(130);
              progress?.Report(++P);
           }
        }       
    }
private void惊人加载\u单击(对象发送者,事件参数e)
{
常数int max=25;
var progressHandler=新进度(值=>{
LoadingText.Text=value+“/”+max;
MainProgressBar.Value=值;
});
var progress=progressHandler作为IProgress;
等待任务。运行(()=>
{
int P=0;
而(P<25)
{
睡眠(130);
进度报告(++P);
}
}       
}

这将在一个单独的线程中处理长时间运行的任务(本例中为睡眠),并通过Progress类重用该值。这样,您的GUI将按照建议在GUI线程中更新,您将获得相应的更新。此外,不建议使用
Application.DoEvents();
,因为您必须了解很多信息。

尝试搜索,不要阻止UI线程,使用backgroundworker。是的,这是“巨大的代码”,但这是必要的。当您在GUI线程中更新控件时,大多数控件将不会处理消息(因为,它们只有在执行结束后才能获得消息)。您应该使用辅助线程。第二种方法(处理消息)不建议使用。进度条具有不同的处理系统,因此它的工作方式与预期相同,但它在图形控件中通常是一个例外。在viewmodel中创建两个属性,一个用于最大值,一个用于当前值,然后绑定到视图中的两个值。在UI线程上放置
线程。睡眠
,将导致删除一个不可用的应用程序。研究如何使用委托并正确地执行。我知道我将要说的不受欢迎,但对于这样一件简单的事情…尝试在加载Text.Text=P+“/25”之后添加
application.DoEvents();
这只是为了向后兼容,不应该使用?至少不是:)@Pikoh我更新了我的答案并更正了它。它来自VB5.X,但在.Net中似乎也可以。你必须知道并避免很多陷阱:这样更好。无论如何,我也会推荐阅读一些我在评论中已经说过的基本相同的内容:对于OP示例中的简单案例,使用
DoEvents()
是完全正确的。
private void StartLoading_Click(object sender, EventArgs e)
    {
        const int max = 25;
        var progressHandler = new Progress<int>(value=>{
            LoadingText.Text = value + "/" + max;
            MainProgressBar.Value = value;
        });

        var progress = progressHandler as IProgress<int>;
        await Task.Run(() =>
        {
           int P = 0;
           while (P < 25)
           {
              Thread.Sleep(130);
              progress?.Report(++P);
           }
        }       
    }