在不使用“await Task.Delay(x)”的情况下延迟WinForms应用程序

时间:2016-02-14 20:08:12

标签: c# .net winforms asynchronous async-await

我正在创建一个扑克应用程序,我想做一些模拟卡片效果的投掷,并做我目前使用的await Task.Delay(x);但是这需要异步任务,如果我切换此方法的地方我执行task.delay(x)到async我将不得不至少再改变5-6到异步。我想这对了解asynchronus工作方式的人来说没什么问题。目前我得到很多逻辑错误只是因为我显然不知道如何异步和等待运算符工作..换句话说我是新手,并且有任何替代这个确切的行await Task.Delay(x);我不会使用任何东西只是这一行连接到异步的其他东西。

以下是代码:

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();
}

2 个答案:

答案 0 :(得分:0)

对于像动画这样的内容,您可能需要System.Windows.Forms.Timer组件,这会引发定期事件。

您可以配置间隔以及暂时禁用它。

请注意,在延迟之后,您将回到处理程序函数的顶部...它不会自动跟踪您在序列中的位置,就像await关键字自动恢复的那样下一行。所以你需要一些计数器或类似的东西让你知道接下来动画的哪一步。

答案 1 :(得分:0)

我不确定你是否想要执行异步,因为它会在完成之前回来。意思是你想要一些定时的东西。 Async在为您提供此功能时会遇到一些麻烦。因为您要么必须等待可能存在问题的响应。特别是如果它是一场比赛。观察异步如何在调试中运行,你会理解。事件触发器或仅定时事件将更好地工作,因为您可以控制触发的时间或等待事件的时间。这将一起消除你的延迟或它应该。

在您的情况下,当时的简单触发事件将显示投掷卡片,一旦完成将继续您的功能。这是简单的术语,你可能需要做一些事情,比如等到触发完成。无论哪种方式,都有大量关于事件的信息。在你去异步之前先看看。因为它的形式你可以随心所欲,如果它适用于Windows手机或其他类型的系统,有些只需要异步。

这应该有帮助: https://msdn.microsoft.com/en-us/library/wkzf914z(v=vs.90).aspx