更新异步插入键

时间:2019-07-16 11:55:48

标签: .net async-await

这是一个控制台应用程序。

//伪代码

While loop{

UpdateData() ;
PrintData() ;

Wait(update Interval) ;

}

当按下按钮时,我需要循环和Wait()来中断/返回。 但是等待不能阻止监听按键。

我认为异步等待可以解决此问题,但使用Timer类可能更好?

我正在寻找解决这种情况的当前最佳实践。

这是我目前的代码,但是我很确定这不是路要走,而且似乎会影响到主线程。我的想法是,在异步PrintUser循环完成之前,此StatMonitor方法不应该完成。

        public async void StartMonitor()
    {
        var cancellationTokenSource = new CancellationTokenSource();

        var keyboardListenTask = Task.Run(() =>
        {
            var key = Console.ReadKey();

            cancellationTokenSource.Cancel(false);

        }, cancellationTokenSource.Token);


        while (!cancellationTokenSource.IsCancellationRequested)
        {
            var userActor = ChooseUserActor();

            while (!cancellationTokenSource.IsCancellationRequested)
            {
                PrintUser(userActor);

                Console.WriteLine("Any key to go back...");
                try
                {
                    await Task.Delay(1000, cancellationTokenSource.Token);
                }
                catch (Exception) { }
            }
        };
    }

1 个答案:

答案 0 :(得分:1)

  

我正在寻找一种处理这种情况的当前最佳实践。

如果要在等待用户输入时定期刷新显示,则将刷新放在Timer中,然后以常规方式等待用户输入(在主线程上调用Console.ReadKey())。 / p>

尽管您可以使用async / awaitTask.DelayCancellationToken s来构建替代解决方案,但这只会增加复杂性,而没有真正的好处。