C# 当屏幕上显示游戏时,如何停止等待任务.Delay()?在C中#

C# 当屏幕上显示游戏时,如何停止等待任务.Delay()?在C中#,c#,timer,C#,Timer,我使用一个单独的计时器类来结束游戏并显示分数,但几秒钟后,屏幕返回到上一个具有相同分数的游戏。这是因为我的计时器快用完了 那么,当屏幕上显示游戏时,如何停止这些计时器呢 我正在使用“等待任务。延迟(1000)”来更改一个数字,并在一段时间后将其更改回来。我还有一个单独的计时器类,它在屏幕上执行游戏。问题是当timer类关闭并显示屏幕时,“wait Task.Delay”计时器尚未完成并继续运行 我的代码如下: using PetrolStationGame; using System; usin

我使用一个单独的计时器类来结束游戏并显示分数,但几秒钟后,屏幕返回到上一个具有相同分数的游戏。这是因为我的计时器快用完了

那么,当屏幕上显示游戏时,如何停止这些计时器呢

我正在使用“等待任务。延迟(1000)”来更改一个数字,并在一段时间后将其更改回来。我还有一个单独的计时器类,它在屏幕上执行游戏。问题是当timer类关闭并显示屏幕时,“wait Task.Delay”计时器尚未完成并继续运行

我的代码如下:

using PetrolStationGame;
using System;
using System.Threading;
using System.Threading.Tasks;


namespace ConsoleApplication1
{


    internal class Program
    {
        internal static char[] arr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; // Arrays for each pump
        internal static int choice; //Dictates player choice

        internal static int flag = 0;

        internal static int CarsWaiting = 0;
        internal static int CarsServiced = 0;
        internal static int FuelLitresSold = 0;
        internal static decimal IncomeMade = 0;
        internal static int Fuel = 15;
        internal static decimal PetrolPrice = 2;
        internal static decimal Commission = 0;
        //internal static double CommissionRate = 0.1;
        //private static object timer;





        internal static void petrol()
        {

            EndGameTimer.endgametimer();
            //RefreshTimer.refreshtimer();
            var tokenSource2 = new CancellationTokenSource();
            CancellationToken ct = tokenSource2.Token;

            do
            {
                PetrolStationGame(); //Loads petrol station pumps
                choice = int.Parse(Console.ReadLine());
                CarsWaitingTimer.carswaitingtimer();

                if (arr[choice] != 'B')
                {
                    ServeCar();

                }
                else
                {
                    Console.WriteLine("The pump {0} is already being used", choice);
                    Console.WriteLine("Press Enter to Continue");
                    Console.ReadLine();

                }

                if (Console.KeyAvailable == false)
                {
                    Thread.Sleep(400);
                }


                else
                {
                    Thread.Sleep(400);
                }




            } while (flag != 1);

            PetrolStationGame();
            Console.Clear();

            if (flag == 1)
            {
                Console.WriteLine("Game Over");
            }
            else
            {
                Console.WriteLine("Draw");
            }
            Console.ReadLine();
        }


        internal static async void ServeCar()
        {
            var tokenSource2 = new CancellationTokenSource();
            CancellationToken ct = tokenSource2.Token;

            {

                int tmp = choice;
                arr[tmp] = 'B';
                CarsServiced++;
                FuelLitresSold = Fuel + FuelLitresSold;
                IncomeMade = FuelLitresSold * PetrolPrice;

                Commission = IncomeMade / 100;
                await Task.Delay(15000); // Time delay
                arr[tmp] = (char)(tmp + 48);
                PetrolStationGame();
                Console.WriteLine("A pump has become free!");



            }
            tokenSource2.Cancel();
        }

        internal static void SpawnCar()
        {


            CarsWaiting++;

        }



        internal static void PetrolStationGame()
        {

            Console.Clear();
            Console.WriteLine("Cars Serviced {0}", CarsServiced);
            Console.WriteLine("Litres of Fuel Sold {0}", FuelLitresSold);
            Console.WriteLine("Income made: £{0}", IncomeMade);
            Console.WriteLine("Commission: £{0}", Commission);
            Console.WriteLine("Cars Waiting {0}", CarsWaiting);
            Console.WriteLine("                ");
            Console.WriteLine("  {0}    {1}    {2}", arr[1], arr[2], arr[3]);
            Console.WriteLine(" ");
            Console.WriteLine("                ");
            Console.WriteLine("  {0}    {1}    {2}", arr[4], arr[5], arr[6]);
            Console.WriteLine(" ");
            Console.WriteLine("                ");
            Console.WriteLine("  {0}    {1}    {2}", arr[7], arr[8], arr[9]);
            Console.WriteLine("                ");

        }

        internal static async void GameOver()
        {

            Console.Clear();
            Console.WriteLine("GAME OVER!");
            Console.WriteLine("");
            Console.WriteLine("Cars Serviced {0}", CarsServiced);
            Console.WriteLine("Litres of Fuel Sold {0}", FuelLitresSold);
            Console.WriteLine("Income made: £{0}", IncomeMade);
            Console.WriteLine("Commission Made: £{0}", Commission);
            Console.WriteLine("Cars Left Waiting {0}", CarsWaiting);
            Console.WriteLine("");
            Console.WriteLine("Game Will Close in 5 seconds");




        }
    }
}
您可以取消任务(包括
Task.Delay
)。有详细的描述

从这篇文章中,您可以创建如下取消令牌:

var tokenSource2 = new CancellationTokenSource();
CancellationToken ct = tokenSource2.Token;

然后,您可以将令牌传递给
Task.Delay
。请确保您可以将这些文件保存在某个位置,以便使用它们来取消任务。

计时器。停止???您能更清楚地了解您遇到的问题吗?我正在使用“等待任务。延迟(1000)”更改一个数字,并在一定时间后将其更改回原来的数字。我还有一个独立的计时器类,它在屏幕上执行游戏。问题是当timer类关闭并显示屏幕时,“wait Task.Delay”计时器尚未完成并继续运行,fwiw,我不会称之为“计时器”。不管怎样,你就不能在延迟后检查一下比赛是否结束了吗?我的意思是,从技术上讲,这是一个竞争条件,但在程序设计等方面,这可能并不重要。另一个计时器看起来更像这样:System.Timers.timer aTimer=new System.Timers.timer();aTimer.Appead+=新的ElapsedEventHandler(OnTimedEvent);a时间间隔=12000;aTimer.Enabled=true;aTimer.AutoReset=true;谢谢,我只是想弄明白如何把它放到我的代码中:请注意,任务取消是合作的。在这种情况下,
Task.Delay
将与您合作;但是不要期望用户任务这样做:)或者,在你从延迟返回后检查游戏结束标志
Cancel
方法在
CancellationToken
@SirRufo感谢你的更正,我写这篇文章时没有坐在IDE前面