如果你希望你的测量处理是可取消的,你必须让它知道某种取消标志。另一种方法是以不合规的方式取消它(中止),但这是非常不鼓励的,因为您可能会在重要的事情中间停止处理,而没有机会清理或释放资源。
而不是BackgroundWorker
您可以使用任务并行库,然后代码可能如下所示:
CancellationTokenSource cts = new CancellationTokenSource();
Task tsk = Task.Factory.StartNew(() =>
{
Measurement measurement = new Measurement();
measurement.Execute(cts.Token);
},
cts.Token,
TaskCreationOptions.LongRunning,
TaskScheduler.Default);
哪里Execute
可能看起来像这样:
public void Execute(CancellationToken ct)
{
ct.ThrowIfCancellationRequested();
while (true)
{
// processing
// ...
// need to cancel?
ct.ThrowIfCancellationRequested();
}
}
要取消在主线程中调用它:
cts.Cancel();
你会得到TaskCancelledException
,但这是意料之中的。
或者,如果您不希望出现异常,请使用以下版本的Execute
. 它并不严格按照 TPL 指南,但如果您不使用条件延续,它会正常工作。
public void Execute(CancellationToken ct)
{
if (ct.IsCancellationRequested)
return;
while (true)
{
// processing
if (ct.IsCancellationRequested)
return;
}
}