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