C# 如何使窗体延迟显示

C# 如何使窗体延迟显示,c#,winforms,stopwatch,timedelay,C#,Winforms,Stopwatch,Timedelay,编辑:Application.DoEvents();这就成功了。可在此处找到: c#,winforms。我想将一个数字增加1步,并在listview中显示这些增量,以便用户看到该数字在递增(例如从10到15) 我有另一个按钮,单击时仅增加1,并使用相同的显示()。它工作正常,并按预期更新显示 我尝试了以下代码(此处缩短以节省空间): (一) (1) 和(2)将数字增加5,但显示完全不更新。当显示器被其他功能更新时显示 (3) 和(4)将数字增加5,但显示器仅在大约1500ms后更新,显示器跳过单

编辑:Application.DoEvents();这就成功了。可在此处找到:

c#,winforms。我想将一个数字增加1步,并在listview中显示这些增量,以便用户看到该数字在递增(例如从10到15)

我有另一个按钮,单击时仅增加1,并使用相同的显示()。它工作正常,并按预期更新显示

我尝试了以下代码(此处缩短以节省空间):

(一)

(1) 和(2)将数字增加5,但显示完全不更新。当显示器被其他功能更新时显示

(3) 和(4)将数字增加5,但显示器仅在大约1500ms后更新,显示器跳过单个步骤并仅显示最终结果(如15)

有什么建议可以让这项工作顺利进行吗?我可以以某种方式强制刷新display()函数吗

为什么t.等待;引起异常?(我在网上某处找到了任务代码)

编辑:

(五)

private void team\u comm\u btn\u all\u单击(对象发送方,事件参数e)
{
对于(int i=0;i<5;i++)
{
等待运行(i);//错误74见下文
}
}
专用异步任务运行(int i)
{
myInt++;
显示();
等待任务。延迟(300);
}
等待运行(i);提供以下信息: 错误74“wait”运算符只能在异步方法中使用。考虑用“AsiNC”修饰符标记该方法,并将其返回类型改为“任务”。

只需执行“Run(i)”,就会发出一个警告,“Wait”已丢失。。。在这种情况下,它编译并毫不延迟地递增5

(六)

private void team\u comm\u btn\u all\u单击(对象发送方,事件参数e)
{
对于(int i=0;i<5;i++)
{
var task=task.Run(异步()=>
{
等待运行(i);
});
}
}
专用异步任务运行(int i)
{
myInt++;
显示();
等待任务。延迟(300);
}

增量为5,但根本不更新显示。

通常您会使用
System.Windows.Forms.Timer
进行此操作。但是
async/await
一经理解,这些事情就变得无关紧要了(仔细阅读编译器警告和错误消息)。简而言之,(5)是解决编译器错误的一个小修改。
但让我们从头开始。假设您首先编写一个像这样的普通同步版本(基本上是您的(3))

但现在它无法编译,出现以下错误

错误74“wait”运算符只能在异步方法中使用。考虑将此方法标记为“AsiNC”修饰符,并将其返回类型改为“任务”。p> 这个信息很清楚。必须用
async
关键字标记方法。将返回类型更改为
Task
的另一个建议是什么,通常您应该考虑它,但由于您在事件处理程序(即签名无法更改的方法)中,您可以忽略该部分-这正是允许
异步void
的原因

最后,您的最终代码如下所示

private void team_comm_btn_all_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 5; i++) 
    {
        if (i != 0) await Task.Delay(300);
        myInt++;
        display();
    }
}
private async void team_comm_btn_all_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 5; i++) 
    {
        if (i != 0) await Task.Delay(300);
        myInt++;
        display();
    }
}
private async void team\u comm\u btn\u all\u Click(对象发送方,事件参数e)
{
对于(int i=0;i<5;i++)
{
如果(i!=0)等待任务,则延迟(300);
myInt++;
显示();
}
}

通常您会使用
System.Windows.Forms.Timer
来实现这一点。但是
async/await
一经理解,这些事情就变得无关紧要了(仔细阅读编译器警告和错误消息)。简而言之,(5)是解决编译器错误的一个小修改。
但让我们从头开始。假设您首先编写一个像这样的普通同步版本(基本上是您的(3))

但现在它无法编译,出现以下错误

错误74“wait”运算符只能在异步方法中使用。考虑将此方法标记为“AsiNC”修饰符,并将其返回类型改为“任务”。p> 这个信息很清楚。必须用
async
关键字标记方法。将返回类型更改为
Task
的另一个建议是什么,通常您应该考虑它,但由于您在事件处理程序(即签名无法更改的方法)中,您可以忽略该部分-这正是允许
异步void
的原因

最后,您的最终代码如下所示

private void team_comm_btn_all_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 5; i++) 
    {
        if (i != 0) await Task.Delay(300);
        myInt++;
        display();
    }
}
private async void team_comm_btn_all_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 5; i++) 
    {
        if (i != 0) await Task.Delay(300);
        myInt++;
        display();
    }
}
private async void team\u comm\u btn\u all\u Click(对象发送方,事件参数e)
{
对于(int i=0;i<5;i++)
{
如果(i!=0)等待任务,则延迟(300);
myInt++;
显示();
}
}

该线程没有涵盖我尝试过的所有内容,我在那里找不到解决问题的方法(请参见上面的编辑)。虽然它确实提高了我对任务的理解=)是的,我没有投票赞成以重复结束,因为我不确定这是否是同一个问题。在async发布之前很久就没有做过WinForms了。事实上,如果“什么都没有”发生,那么您会突然看到最终值,这感觉就像windows消息队列没有被处理一样。例如,如果在普通事件处理程序中有一个更新UI的循环,则会出现这种行为。但是,我不知道这是如何应用于您的具体情况的;这就成功了。发现于此:这有时“有效”,但不是一个优雅的解决方案。您的代码定期触发要触发的事件队列。如果您的代码不经常这样做,UI将变得迟钝。由于这确实解决了问题,这可能意味着您正在阻止UI线程,而不是在单独的线程上进行处理。该线程没有涵盖我尝试的所有内容,我在那里找不到解决问题的方法(请参见上面的编辑)。虽然它确实提高了我对任务的理解=)是的,我没有投票以重复的方式结束,因为我不确定
private void display()
{   
    myListView.Items.Clear();
    myListView.Items.Add(new ListViewItem(new[] { myInt }));
}
private void team_comm_btn_all_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 5; i++) 
    {
            await Run(i); //error 74 see below
    }
}

private async Task Run(int i)
{
    myInt++;
    display();
    await Task.Delay(300);
}
private void team_comm_btn_all_Click(object sender, EventArgs e)
{
   for (int i = 0; i < 5; i++) 
   {
       var task = Task.Run(async () =>
        {
            await Run(i);
        });
   }
}

private async Task Run(int i)
{
    myInt++;
    display();
    await Task.Delay(300);
}
private void team_comm_btn_all_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 5; i++) 
    {
        if (i != 0) System.Threading.Thread.Sleep(300);
        myInt++;
        display();
    }
}
private void team_comm_btn_all_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 5; i++) 
    {
        if (i != 0) await Task.Delay(300);
        myInt++;
        display();
    }
}
private async void team_comm_btn_all_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 5; i++) 
    {
        if (i != 0) await Task.Delay(300);
        myInt++;
        display();
    }
}