私は通常、(現実的に) 1 ~ 2 秒以上かかる可能性のあるアクションを、次のような別のタスクに配置します。
public interface ITask
{
void ExecuteTask (ITaskExecutionContext context);
void AfterSuccess(ITaskExecutionContext context);
void AfterFailure(ITaskExecutionContext context);
void AfterAbortion(ITaskExecutionContext context);
}
このようなタスクを実行するための抽象化もあります。
public interface ITaskExecutor : IDisposable
{
void BeginTask(ITask task);
void TellTaskToStop();
}
これの実装の 1 つは、次ITaskExecutor
を使用していBackgroundWorker
ます。
public class BackgroundTaskExecutor : ITaskExecutor
{
public void BeginTask(ITask task)
{
this.task = task;
worker = new BackgroundWorker ();
worker.DoWork += WorkerDoWork;
worker.RunWorkerCompleted += WorkerRunWorkerCompleted;
worker.WorkerSupportsCancellation = true;
worker.RunWorkerAsync();
}
...
}
私は、依存性注入と IoC に大きく依存して、物事を結び付けています。プレゼンターでは、次のように呼び出します。
GoAndDontReturnUntilYouBringMeALotOfMoneyTask task = new GoAndDontReturnUntilYouBringMeALotOfMoneyTask(parameters);
taskExecutor.BeginTask(task);
キャンセル/中止ボタンは配線されているため、タスク実行者/タスクに中止を指示します。
実際には、ここで示したものよりも少し複雑ですが、これが一般的な考え方です。