WPF C#游戏:延迟行的代码延迟方法

WPF C#游戏:延迟行的代码延迟方法,c#,wpf,C#,Wpf,我有一个小游戏项目,你可以射击,但主要的问题是射击之间没有延迟,所以我尝试使用不同的计时器。看起来最好的选择是DispatcheTime,但当它运行时,整个程序停止了5秒钟,所以我只想知道是否有一种方法可以在不停止所有操作的情况下延迟程序中的一行代码,或者有更好的方法吗?您可以尝试以下方法 MainWindow.xaml.cs public partial class MainWindow : Window { private CancellationTokenSource _cance

我有一个小游戏项目,你可以射击,但主要的问题是射击之间没有延迟,所以我尝试使用不同的计时器。看起来最好的选择是DispatcheTime,但当它运行时,整个程序停止了5秒钟,所以我只想知道是否有一种方法可以在不停止所有操作的情况下延迟程序中的一行代码,或者有更好的方法吗?

您可以尝试以下方法

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    private CancellationTokenSource _cancellationTokenSource;

    public MainWindow()
    {
        InitializeComponent();
    }

    private async void ShootBox_OnKeyDown(object sender, KeyEventArgs keyEventArgs)
    {
        if (_cancellationTokenSource != null)
            return;

        _cancellationTokenSource = new CancellationTokenSource();
        await ShootThatDamnPistol(_cancellationTokenSource.Token);
    }
    private void ShootBox_OnKeyUp(object sender, KeyEventArgs keyEventArgs)
    {
        _cancellationTokenSource.Cancel();
        _cancellationTokenSource = null;
    }
    async Task ShootThatDamnPistol(CancellationToken cToken)
    {
        try
        {
            while (!cToken.IsCancellationRequested)
            {
                await Task.Delay(500, cToken);
                ShootBox.Text += "Bang!" + Environment.NewLine;
            }
        }
        catch (TaskCanceledException)
        {
            //nope
        }
    }
}
main window.xaml

<Window x:Class="WpfApp17.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TextBox x:Name="ShootBox"
             KeyDown="ShootBox_OnKeyDown"
             KeyUp="ShootBox_OnKeyUp" />
</Window>


不要编写延迟语句,否则会阻塞线程并禁止用户执行任何操作。我会使用一个计时器和一个设置为TRUE的公共布尔标志,当计时器应该进行拍摄时。在计时器中,您可以在决定拍摄时将标志设置回FALSE。在这个节拍上。。或者在下一个滴答声。。或者在10点之后。。取决于用户的拍摄速度。完全奇怪的理由来结束这个问题怎么能认为这是一个与意见相关的问题?仅仅因为一个问题可能有不同的解决方案并不意味着它是基于意见的,hack任何与LINQ相关的问题都可能是封闭的陈述意见,因为一个人的意见是用for循环来写的,另一个人更喜欢for-each,下一个while循环,后面的一个更喜欢do循环,有人更愿意切换到if等等…@RandRandom,如果它能在接近的原因下重新打开是没有意义的。一个快速的搜索引擎查询显示,虽然有很多关于WPF和延迟操作的问题,但它们通常不是OP所需要的。因此,我们只剩下专注和清晰。您可以尝试编辑问题标题和正文以修复它。你会有一个问题,Op谈论的是一个问题“Dispatchetime,但当它运行时,整个程序停止了5秒”,但没有MRE。这是我在这里的第一篇文章,所以我不知道为什么它被标记为某事,但我会考虑到你的评论,所以谢谢你。。。。。这比我的评论要好。