Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中延迟任务中部分代码的执行#_C#_Wpf_Multithreading - Fatal编程技术网

C# 如何在C中延迟任务中部分代码的执行#

C# 如何在C中延迟任务中部分代码的执行#,c#,wpf,multithreading,C#,Wpf,Multithreading,我有这个方法,我需要暂停一段时间。 这就是我所尝试的: private async void btnStart_Click(object sender, RoutedEventArgs e) { await Task.Run(() => { this.Dispatcher.Invoke((Action)(() => { NewGame();

我有这个方法,我需要暂停一段时间。 这就是我所尝试的:

private async void btnStart_Click(object sender, RoutedEventArgs e)
    {
        await Task.Run(() =>
        {
            this.Dispatcher.Invoke((Action)(() =>
            {
                NewGame();

                // Game Loop
                for (int i = 0; i < 35; i++)
                {
                    int index = _random.Next(0, _numbersInGame.Count);
                    int number = _numbersInGame.ToArray()[index];
                    lblCurrentNumber.Content = number.ToString();

                    Task.Delay(1000).Wait(); // I want to add pause here

                    (this.FindName($"lblNum{i + 1}") as Label).Content = number.ToString();
                    lblCurrentNumber.Content = "";
                    _numbersInGame.RemoveAt(index);
                }
            }));
        });
    }
private async void btnStart\u单击(对象发送方,路由目标)
{
等待任务。运行(()=>
{
this.Dispatcher.Invoke((操作)(()=>
{
新游戏();
//游戏循环
对于(int i=0;i<35;i++)
{
int index=_random.Next(0,_numbersInGame.Count);
整数=_numbersInGame.ToArray()[index];
lblCurrentNumber.Content=number.ToString();
Task.Delay(1000).Wait();//我想在这里添加暂停
(this.FindName($“lblNum{i+1}”)作为标签);
lblCurrentNumber.Content=“”;
_编号名称移除(索引);
}
}));
});
}
欢迎任何帮助。 谢谢

  • 您不需要将其卸载到任务中(使用
    task.Run
  • 由于没有卸载,因此不需要使用
    Invoke
    封送回UI线程
  • 鉴于上述情况,您可以习惯性地
    等待
    任务。延迟
    而不阻塞UI
  • 示例

    private async void btnStart_Click(object sender, RoutedEventArgs e)
    {
       for (int i = 0; i < 35; i++)
       {
          NewGame();
    
          int index = _random.Next(0, _numbersInGame.Count);
          int number = _numbersInGame.ToArray()[index];
          lblCurrentNumber.Content = number.ToString();
    
          await Task.Delay(100);
    
          (this.FindName($"lblNum{i + 1}") as Label).Content = number.ToString();
          lblCurrentNumber.Content = "";
          _numbersInGame.RemoveAt(index);
       }
    }
    
    private async void btnStart\u单击(对象发送方,路由目标)
    {
    对于(int i=0;i<35;i++)
    {
    新游戏();
    int index=_random.Next(0,_numbersInGame.Count);
    整数=_numbersInGame.ToArray()[index];
    lblCurrentNumber.Content=number.ToString();
    等待任务。延迟(100);
    (this.FindName($“lblNum{i+1}”)作为标签);
    lblCurrentNumber.Content=“”;
    _编号名称移除(索引);
    }
    }
    
    像这样使用async和Wait模式可以安全地更新UI,因为续集将发布回UI上下文。它还允许消息泵/调度器继续不减弱,直到等待的延迟完成

    最后,您可能希望使用标志或类似标志保护此方法不受双击的影响(因为ui可以自由重新输入)

  • 您不需要将其卸载到任务中(使用
    task.Run
  • 由于没有卸载,因此不需要使用
    Invoke
    封送回UI线程
  • 鉴于上述情况,您可以习惯性地
    等待
    任务。延迟
    而不阻塞UI
  • 示例

    private async void btnStart_Click(object sender, RoutedEventArgs e)
    {
       for (int i = 0; i < 35; i++)
       {
          NewGame();
    
          int index = _random.Next(0, _numbersInGame.Count);
          int number = _numbersInGame.ToArray()[index];
          lblCurrentNumber.Content = number.ToString();
    
          await Task.Delay(100);
    
          (this.FindName($"lblNum{i + 1}") as Label).Content = number.ToString();
          lblCurrentNumber.Content = "";
          _numbersInGame.RemoveAt(index);
       }
    }
    
    private async void btnStart\u单击(对象发送方,路由目标)
    {
    对于(int i=0;i<35;i++)
    {
    新游戏();
    int index=_random.Next(0,_numbersInGame.Count);
    整数=_numbersInGame.ToArray()[index];
    lblCurrentNumber.Content=number.ToString();
    等待任务。延迟(100);
    (this.FindName($“lblNum{i+1}”)作为标签);
    lblCurrentNumber.Content=“”;
    _编号名称移除(索引);
    }
    }
    
    像这样使用async和Wait模式可以安全地更新UI,因为续集将发布回UI上下文。它还允许消息泵/调度器继续不减弱,直到等待的延迟完成


    最后,您可能希望保护此方法不受带有标志或类似内容的双击的影响(因为ui可以自由重新输入)

    4分钟后,我将能够将您的答案标记为正确的解决方案。4分钟后,我将能够将您的答案标记为正确的解决方案。