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