在WinForms应用程序中使用RxFramework。我试图运行Observable异步并使用CancellationDisposable来取消操作时,用户单击按钮。但它不工作!为什么这个CancellationDisposable永远不会取消Observable.Dispose()?
假设我有一个带有2个按钮和ProgressBar的窗体。 Button1_click订阅新线程的观察者。然后立即按下Button2_click以取消操作。 为什么取消.Token.IsCancellationRequested永远不会是真的?
private IDisposable obs = null;
private void button1_Click(object sender, EventArgs e) {
var countObserver = Observable.Create<int>(observer => {
var cancel = new CancellationDisposable();
if (!cancel.Token.IsCancellationRequested) {
//Step 1 of a long running process using lot of resources...
observer.OnNext(1);
}
if (!cancel.Token.IsCancellationRequested) {
//Step 2 of a long running process using lot of resources...
observer.OnNext(1);
}
if (!cancel.Token.IsCancellationRequested) {
//Step 3 of a long running process using lot of resources...
observer.OnNext(1);
}
observer.OnCompleted();
return cancel;
});
obs = countObserver
.ObserveOn(new ControlScheduler(this))
.SubscribeOn(Scheduler.ThreadPool)
.Subscribe(i => {
//Update a progress bar here...
});
}
private void button2_Click(object sender, EventArgs e) {
if (obs != null)
obs.Dispose();
}
如果可观察性提前处理,应该调用OnCompleted? Rx准则在这里所说的是什么? –
@BentRasmussen我不确定,但我猜他们什么也没说。您可以决定何时可观察序列结束。如果在取消时不打电话给'OnCompleted',那么它不会结束。根据你的具体任务,它可能是好的或坏的。就我个人而言,我倾向于认为它应该在这种情况下结束,也许有一个区分成功和取消完成的特殊标志。 –