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する)とのコトで、テーマが変わってしまったので、やむを得ず現状に至っています。