C#非同期\は、ファイルのアップロード/ダウンロードのプログレスバーの実装原理を待つ障害を持つ小パーティー

UIに関連したアップロードとダウンロードファイル(写真など)、について対応するAPIで提供プログレスバー、C#のSystem.IProgressを表示します。

名前空間のシステム
{ 
    // 
    // 概要:
     //      プロバイダ更新の定義された進展。
    // 
    // 型パラメータ:
     //    T:
     //      進歩は型の値を更新します。引数このタイプのインバータです。すなわち、指定された下部タイプまたは派生型の使用。共変とインバータの詳細については、共分散とジェネリックを参照してください。
    パブリック インターフェイス <IProgress  T> 
    { 
        // 
        // 概要:
         //      レポートの進捗状況。
        // 
        // パラメータ:
         //    値:
         //      進行状況の更新後の値。
        無効レポート(T値); 
    } 
}

コードの関連する使用があるように、複数のファイルについては、使用することは、まだ非常に良い選択です。

1    非同期タスク< INT > UploadPicturesAsync(一覧< オブジェクト >イメージリスト、IProgress < INT > 進捗、CancellationTokenのCT)
 2          {
 3              試み
4              {
 5                  INT totalCountプロパティ= imageList.Count。
6                  INT processCount = 待つ Task.Run < 整数 >(()=>
 7                  {
 8                      INT tempCount = 0 ;
 9                      foreachのVARの画像イメージリスト)
 10                     {
 11                          //は、ここでの処理とアップロードロジックを待つ
 12                          // INT処理は= UploadAndProcessAsync(画像)を待ちます。
13                          // 异步上传/下载方法
14の                         ブール成功= Task.Run(非同期()=>
 15                                    {
 16は                                       待つ Task.Delay(2000 );
 17                                        戻り image.ToString()== " 取消"18                                    })。結果;
19                          もし(ct.IsCancellationRequested)      // 判断是否取消
20                          {
 21                              ct.ThrowIfCancellationRequested()。
22                          }  
 23                          場合(進行!= NULL 24                          {
 25                              progress.Report((tempCount * 100 / totalCountプロパティ))。
26                          }
 27                          tempCount ++ 28                      }
 29  
30                      リターンtempCount。
31                 });
 32                  戻りprocessCount;
 33である             }
 34は、             キャッチ(OperationCanceledException EX)
 35              {    
 36                  EX;
 37              }
 38である         }
 39          //がキャンセルされる送信信号System.Threading.CancellationToken
 40          // cts.Tokenが情報を発信キャンセルされなければなりません通知動作。
41は          CancellationTokenSource CTS = 新しい新しいCancellationTokenSource();
 42である         ///  <まとめ> 
43である         /// プログレスバーが非同期非同期アップロードボタンアップロード
 44である         ///  </要約>
45          公共 非同期 無効にProgressBar()
 46は         、{
 47              // <T>の進捗状況を構築し、アクション<T> AS ReportProgressザ・を渡して 
 48の             // 呼び出しごとの進捗状況に関する進捗報告書は、コールバック値を提供
49              のvar progressIndicator = 新しい新しい進歩は< 整数 > (ReportProgress);
 50              //はコール非同期メソッド
 51は             // アナログアップロード/ダウンロードファイル
52が              一覧< オブジェクト > =ファイル新しい新しいリスト< オブジェクト >
 53である             {
 54である                 。12" 取消"3452411 
55              }。
56              試みる
57              {
 58件                 のint =はアップロード待つUploadPicturesAsync(ファイル、progressIndicator、cts.Token)を、
59                  Console.WriteLineを($ " アップロードカウント=> {アップロード} " );
60              }
 61              キャッチ(OperationCanceledExceptionのEX)
 62              {
 63                  Console.WriteLineを($ "アップロードキャンセル:ex.Message {} " );
 64              }
 65          }
 66          ///  <まとめ> 
67          /// UIスレッドの対話
 68          ///  </要約> 
69          ///  <PARAM名="値「> </ PARAM> 
70          空隙 ReportProgress(INTの値)
 71である         {
 72              // UIスレッドが情報表示進行
73は              Console.WriteLineを($ " {値}%" );
 74              IF(値== 33である// アナログキャンセルボタン処理
75              {
76                  cts.Cancel()。
77              }
 78              //が戻される進捗値を反映するようにUIを更新します。
79          }

 参考:https://devblogs.microsoft.com/dotnet/async-in-4-5-enabling-progress-and-cancellation-in-async-apis/

おすすめ

転載: www.cnblogs.com/LPudding/p/11096237.html