コンソールを使用して進行状況バーを印刷する簡単な方法。
操作用の既製の IProgress インターフェイスがあります。
例:
var prog = new Progress<double>((theV => {
Console.WriteLine($@"Now the Progress:"
+ COUNT / 10.0 * 100 + "%" + new string('#', COUNT));
COUNT++;
Console.SetCursorPosition(0, 0);
}));
for(int i = 0; i < 10; i++)
{
Thread.Sleep(200);
((IProgress<double>)prog).Report(i / 10.0);
}
効果:
原則:
IProgress インターフェイスは void Report(T value); メソッドを実装する必要があります。T
は progress の値です
。さまざまなデータ型にすることができます。最も一般的なのは int で、主に 1 ~ 100 で表されます。
IProgress の基本実装クラスProgress は、パラメーター化されたコンストラクターpublic Progress (アクション ハンドラー)
を持つことができ、このメソッドのパラメーターは戻り値のないアクションです (理解できる)。 void メソッドとして)、ただし、それは T ジェネリック パラメーターである必要があります。Report が呼び出されるたびに、ハンドラー メソッドが自動的に実行され、このハンドラーの T 型パラメーターは Report の値になります。注:実行のスレッドは異なりますが、順序は同期です。非同期実行に設定する必要があります。
非同期は次のように変更できます。
Task<string> task = new Task<string>(()=> {
string tag = $@"|/-\"; int tag_index = 0;
int COUNT = 0;
var prog = new Progress<double>((theV => {
Console.Out.WriteLineAsync($@" args:{
theV}|{
tag[tag_index++ % tag.Length]}|ThreadID:{
Thread.CurrentThread.ManagedThreadId}Now Progress is"
+ COUNT / 10.0 * 100 + "%" + new string('#', COUNT));
COUNT++;
Console.SetCursorPosition(0, 0);
}));
for (int i = 0; i < 10; i++)
{
Thread.Sleep(200);
((IProgress<double>)prog).Report(i / 10.0);
}
return "success";
});
task.Start();
Console.WriteLine("在这之前的会执行-----");
await task;
Console.WriteLine("异步完成后才执行");