65.9K
CodeProject 正在变化。 阅读更多。
Home

DNX 控制台应用程序旋转指示器示例

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2016年3月13日

CPOL

1分钟阅读

viewsIcon

10407

控制台应用程序的简单基于任务的旋转指示器

引言

如果你需要在控制台应用程序中使用一个旋转指示器,你可以通过 Google 或其他搜索引擎轻松找到基于线程的示例。但是,我找不到适用于 DNX 控制台应用程序的有效的旋转指示器示例。本文展示了如何在 DNX 控制台应用程序中实现一个简单的旋转指示器

背景

如果你使用 DNX 核心依赖项,你将无法使用一些传统的线程技术和控制台功能。为了创建旋转指示器,我将使用任务并行库 (TPL),并且为了规避缺失的控制台功能,我使用\r字符代替Console.CursorLeft

Using the Code

你可以在你的 DNX 控制台应用程序中使用这个类来实现一行开头的旋转指示器。我使用 "\r" 两次,因为我希望控制台输出中的旋转指示器字符在停止后被覆盖。

public class ConsoleSpinner
{
    private CancellationTokenSource TokenSource { get; set; }
    private Task Task { get; set; }

    public ConsoleSpinner()
    {
        this.TokenSource = new CancellationTokenSource();
    }

    public void Start()
    {
        var token = this.TokenSource.Token;

        if (this.Task == null)
        {
            this.Task = Task.Run(() =>
            {
                while (!token.IsCancellationRequested)
                {
                    var spinChars = new char[] { '|', '/', '-', '\\' };

                    foreach (var spinChar in spinChars)
                    {
                        Console.Write(string.Concat("\r", spinChar, "\r"));

                        System.Threading.Tasks.Task.Delay(25).Wait();
                    }
                }
            }, token);
        }
    }

    public void Stop()
    {
        this.TokenSource.Cancel();
        this.Task.Wait();
        this.Task = null;
    }
}

按如下方式使用旋转指示器

var spinner = new ConsoleSpinner();

spinner.Start();

// do something

spinner.Stop();

关注点

使用新的 DNX 核心框架很有趣,但目前,我发现自己很难找到替代方案,用于正常 .NET 框架中包含的技术/命名空间。我想随着更多 DNX 核心的 nuget 包的可用,情况会得到改善。

历史

  • 2016年3月13日:初始版本
© . All rights reserved.