C#,C#の宿題片付けます。

このエントリーをはてなブックマークに追加
759 ◆ctrmjOHDMc
【.NET Framework】 4.0
【技術】Task
【やりたいこと】
 ユーザのフォルダ、ファイルのD&Dに対し、渡されたフォルダ&ファイル内の特定パターンのファイルすべてに
 時間のかかる処理をしたい。

 ・Cancellationの実装。
  → 現在キューイングされているタスクをすべて停止し、Complete(Reason=Cancel)を呼び出す。

 ・Progressイベントの実装。
  → フォルダ・ファイルの進行状況を、別々に表示する。
    また、ファイルの進行状況は、「現在キューイングされているフォルダ・ファイルに含まれるすべてのファイル数」に基づく値とする。
    さらに、進行中にユーザのD&Dがあった場合は、即座にそのフォルダ、ファイルも進行状況に反映する。

 ・Completeイベントの実装。
  → キューイングされているすべてのフォルダ・ファイルを処理しおえた段階で、1度だけ呼び出す。
    Complete(Reason=Complete)
 ・Exceptionイベントの実装。
  → 現在キューイングされているすべてのタスクの内で、例外が発生した場合は
    即座に残りのキューをキャンセルし、Complete(Reason=Fault)を呼び出す。

【許容範囲】
 Completeが呼び出された直後(最中)に、ユーザのD&Dが行われた場合、
 Progressはリセットされた状態から始まっても構わない。

【背景】
 文章で見るととてもシンプルに思えるんですが、Taskクラスの扱いが難しすぎてちんぷんかんぷんなので、
 試行錯誤後のソースコードは次のレスに載せますが、かえって読まない方が作れるかも。

 最初はQueue<T>+Thread+CancelException(自作のException)でとてもマニュアルな作り方してたんですが、
 CUIで利用する場合は同期する(TaskでWaitする)とのコトで、テーマが変わってしまったので、やむを得ず現状に至っています。