C# はコンソールに進行状況バーを表示します [同期および非同期]

コンソールを使用して進行状況バーを印刷する簡単な方法。
操作用の既製の 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("异步完成后才执行");

おすすめ

転載: blog.csdn.net/jamenu/article/details/128532275