我通常将任何可能(实际上)花费一两秒以上的操作放入单独的任务中,例如:
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();
}
其中一种实现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);
然后连接取消/中止按钮,以便它们告诉任务执行器/任务中止。
它实际上比这里介绍的要复杂一些,但这是一般的想法。