C# 在WinForms应用程序中延迟而不使用;等待任务。延迟(x)“;
我正在创建一个扑克牌应用程序,我想对扑克牌的投掷效果进行某种模拟,并使用C# 在WinForms应用程序中延迟而不使用;等待任务。延迟(x)“;,c#,.net,winforms,asynchronous,async-await,C#,.net,Winforms,Asynchronous,Async Await,我正在创建一个扑克牌应用程序,我想对扑克牌的投掷效果进行某种模拟,并使用wait Task.Delay(x)但是,这需要异步任务,如果我在执行任务的地方切换此方法。延迟(x)为异步,我还必须将至少5-6个更改为异步。我想这对于理解异步工作方式的人来说是很好的。目前我收到了很多逻辑错误,因为我显然不知道async和await操作符是如何工作的。。换言之,我是新手,除了这行等待任务,还有其他选择吗我不会使用任何其他连接到async的东西,就在这一行 代码如下: private async Task
wait Task.Delay(x)代码>但是,这需要异步任务,如果我在执行任务的地方切换此方法。延迟(x)为异步,我还必须将至少5-6个更改为异步。我想这对于理解异步工作方式的人来说是很好的。目前我收到了很多逻辑错误,因为我显然不知道async和await操作符是如何工作的。。换言之,我是新手,除了这行等待任务,还有其他选择吗代码>我不会使用任何其他连接到async的东西,就在这一行
代码如下:
private async Task Shuffle()
{
Bitmap refreshBackImage = new Bitmap(getBack);
bCall.Enabled = false;
bRaise.Enabled = false;
bFold.Enabled = false;
bCheck.Enabled = false;
MaximizeBox = false;
MinimizeBox = false;
bool check = false;
horizontal = tbChips.Left - _settings.Width * 2 - 15;
vertical = pbTimer.Top - _settings.Height - (_settings.Height) / 7;
RNGCrypto random = new RNGCrypto();
for (i = ImgLocation.Length; i > 0; i--)
{
int j = random.Next(i);
string k = ImgLocation[j];
ImgLocation[j] = ImgLocation[i - 1];
ImgLocation[i - 1] = k;
}
for (i = 0; i < 17; i++)
{
Deck[i] = Image.FromFile(ImgLocation[i]);
string[] charsToRemove = { getCards, ".png", "\\" };
foreach (string c in charsToRemove)
{
ImgLocation[i] = ImgLocation[i].Replace(c, string.Empty);
}
Reserve[i] = int.Parse(ImgLocation[i]) - 1;
Holder[i] = new PictureBox
{
SizeMode = PictureBoxSizeMode.StretchImage,
Height = _settings.Height,
Width = _settings.Width
};
Controls.Add(Holder[i]);
Holder[i].Name = "pb" + i;
await Task.Delay(150);
#region Throwing Cards
SetPlayers(Player, i, ref check, 560, 470, refreshBackImage);
SetPlayers(Bot1, i, ref check, 15, 420, refreshBackImage);
SetPlayers(Bot2, i, ref check, 75, 65, refreshBackImage);
SetPlayers(Bot3, i, ref check, 590, 25, refreshBackImage);
SetPlayers(Bot4, i, ref check, 1115, 65, refreshBackImage);
SetPlayers(Bot5, i, ref check, 1160, 420, refreshBackImage);
if (i >= 12)
{
Holder[12].Tag = Reserve[12];
if (i > 12) Holder[13].Tag = Reserve[13];
if (i > 13) Holder[14].Tag = Reserve[14];
if (i > 14) Holder[15].Tag = Reserve[15];
if (i > 15)
{
Holder[16].Tag = Reserve[16];
}
if (!check)
{
horizontal = 410;
vertical = 265;
}
check = true;
if (Holder[i] != null)
{
Holder[i].Anchor = AnchorStyles.None;
Holder[i].Image = refreshBackImage;
//Holder[i].Image = Deck[i];
Holder[i].Location = new Point(horizontal, vertical);
horizontal += 110;
}
}
#endregion
Bot1 = (Bot)FoldedPlayer(Bot1);
Bot2 = (Bot)FoldedPlayer(Bot2);
Bot3 = (Bot)FoldedPlayer(Bot3);
Bot4 = (Bot)FoldedPlayer(Bot4);
Bot5 = (Bot)FoldedPlayer(Bot5);
if (i == 16)
{
if (!restart)
{
MaximizeBox = true;
MinimizeBox = true;
}
Turns();
}
}
Ending();
}
private async Task Shuffle()
{
位图refreshBackImage=新位图(getBack);
bCall.Enabled=false;
炖煮。启用=false;
bFold.Enabled=false;
bCheck.Enabled=false;
MaximizeBox=假;
b x=假;
布尔检查=假;
水平=tbChips.Left-_settings.Width*2-15;
垂直=pbTimer.Top-_settings.Height-(_settings.Height)/7;
RNGCrypto random=新的RNGCrypto();
对于(i=ImgLocation.Length;i>0;i--)
{
int j=随机。下一个(i);
字符串k=ImgLocation[j];
ImgLocation[j]=ImgLocation[i-1];
i位置[i-1]=k;
}
对于(i=0;i<17;i++)
{
Deck[i]=Image.FromFile(ImgLocation[i]);
字符串[]charsToRemove={getCards,.png,“\\”};
foreach(charsToRemove中的字符串c)
{
ImgLocation[i]=ImgLocation[i]。替换(c,string.Empty);
}
Reserve[i]=int.Parse(ImgLocation[i])-1;
支架[i]=新的图片盒
{
SizeMode=PictureBoxSizeMode.StretchImage,
高度=_settings.Height,
宽度=_settings.Width
};
增加(持有人[i]);
持有人[i].Name=“pb”+i;
等待任务。延迟(150);
#区域投掷卡片
设置播放器(播放器,i,参考检查,560470,刷新背景图像);
SetPlayers(Bot1,i,ref-check,15,420,refreshBackImage);
SetPlayers(Bot2、i、ref检查、75、65、refreshBackImage);
设置播放器(Bot3、i、ref检查、590、25、刷新背景图像);
SetPlayers(Bot4、i、ref检查、1115、65、refreshBackImage);
设置播放器(Bot5、i、ref检查、1160420、refreshBackImage);
如果(i>=12)
{
持有者[12]。标签=保留[12];
如果(i>12)保持器[13]。标记=保留[13];
如果(i>13)保持器[14]。标记=保留[14];
如果(i>14)保持器[15]。标记=保留[15];
如果(i>15)
{
持有者[16]。标签=保留[16];
}
如果(!检查)
{
水平=410;
垂直=265;
}
检查=正确;
if(持有者[i]!=null)
{
持有者[i]。锚=锚类型。无;
Holder[i]。Image=refreshBackImage;
//持有者[i]。图像=甲板[i];
支架[i]。位置=新点(水平、垂直);
水平+=110;
}
}
#端区
Bot1=(Bot)折叠播放器(Bot1);
Bot2=(Bot)折叠播放器(Bot2);
Bot3=(Bot)折叠播放器(Bot3);
Bot4=(机器人)折叠播放器(Bot4);
Bot5=(Bot)折叠播放器(Bot5);
如果(i==16)
{
如果(!重新启动)
{
MaximizeBox=真;
极小值box=真;
}
转弯();
}
}
结束();
}
对于动画之类的东西,您可能需要System.Windows.Forms.Timer
组件,它会引发周期性事件
您可以配置时间间隔,也可以暂时完全禁用它
请注意,延迟之后,您将返回处理程序函数的顶部。。。它不会自动跟踪您在序列中的位置,wait
关键字会在下一行自动恢复。因此,您需要一些计数器之类的东西来让您知道动画的下一步是什么。我不确定您是否要执行异步,因为它在完成之前不会返回。意思是如果你想做点什么。Async在为您提供此服务时会遇到一些问题。因为你要么要等待回应,这可能是个问题。尤其是如果这是一场游戏。观察异步如何在调试中运行,您就会理解。一个事件触发器,或者仅仅是一个定时事件会更好地工作,因为您可以控制它何时触发或者您等待事件的时间。这将消除您的所有延迟,否则应该这样做
在您的情况下,此时一个简单的触发事件将显示掷卡,完成后将继续执行您的功能。这很简单,您可能需要做一些事情,比如等待触发器完成。无论哪种方式,都有大量关于事件的信息。在使用异步之前,请先看一看。由于它是表单,所以您可以随意操作,如果它用于windows phone或其他类型的系统,有些系统只需要异步
这将有助于:
请展示您的代码。学习异步而不是问这个问题对您来说是否更有意义?@usr:是和否。对计时代码的更改将是入侵性的,但游戏逻辑只能timercardshown.Enabled=true代码>然后继续。确切地说,这种恢复造成了一些麻烦,我在我的项目中间。是的,我会看看AsiNC,但是一旦我完成了。“洗牌”方法目前至少负责三件事:随机化卡片的顺序,将它们与玩家关联,以及UI动画,使用s