如何解决如何在C#中循环执行开关功能
我已经编写了一个代码,因此您可以掷骰子,但我希望骰子在结束最后一面之前先闪烁骰子的不同侧面。在for
循环中使用开关时,该开关似乎不起作用。这就是我到目前为止所拥有的。
Random r = new Random();
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
foreach (Control x in this.Controls)
{
if (x is PictureBox && x.Tag.ToString() == "Dice")
{ x.Visible = false; }
}
int rInt = r.Next(1,7);
switch (rInt)
{
case 1: Dice1.Visible = true; break;
case 2: Dice2.Visible = true; break;
case 3: Dice3.Visible = true; break;
case 4: Dice4.Visible = true; break;
case 5: Dice5.Visible = true; break;
case 6: Dice6.Visible = true; break;
}
Console.WriteLine(rInt);
}
控制台中的输出显示,它确实需要10个随机数,但是switch
似乎除了最后一个数字外都没有执行。
有人知道我做错了吗?
解决方法
Thread.Sleep(1000);
这将阻塞线程。它不允许它做其他工作,例如绘画。
相反,请使用await Task.Delay(1000)
或Timer回调。
您需要在循环末尾在窗体或容器控件上添加对Refresh()
方法的调用,否则将在不更改UI的情况下执行循环(UI线程被循环“阻塞”) :
for ( int i = 0; i < 10; i++ )
{
...
Refresh(); // or Panel.Refresh()
}
https://docs.microsoft.com/dotnet/api/system.windows.forms.control.refresh
也许您还可以使用图片框的名称代替Tag
来获得更好,更简洁的代码,因为在这里使用Tag
并不是真的有用:
if ( x is PictureBox && x.Name.StartsWith("Dice") )
例如,名称为Dice1,Dice2...。
例如,如果要添加一个按钮来停止带有条件变量的循环,也可以添加Application.DoEvents()
:
for ( int i = 0; i < 10; i++ )
{
Application.DoEvents();
if ( CancelRequired ) break;
...
Refresh();
}
或根据需要使用多线程...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。