如果我有一个长时间运行的流,例如:
inputStream.Select(n => Task.Run(() =>
{
// Long running operation
Thread.Sleep(TimeSpan.FromSeconds(5));
return n * n;
}).ToObservable())
.Switch()
.Subscribe(result =>
{
// Use result in some way
Console.WriteLine(result);
});
如何在Task.Run
调用中获取CancellationToken,以便在Switch
处置正在进行的计算的订阅时,将CancellationToken设置为已取消,因此我知道中止计算。
答案 0 :(得分:3)
您可以使用Observable.StartAsync
方法,例如
inputStream.Select(n => Observable.StartAsync((token => Task.Run(() =>
{
if (token.IsCancellationRequested)
{
// .. don't need to do anything
return 0;
}
else
{
Thread.Sleep(TimeSpan.FromSeconds(1));
return n * n;
}
}))))
.Switch()
.Subscribe(Console.WriteLine);
或者,如果您要生成多个值,则可以使用与Observable.Create
一起使用的Task
重载来获取CancellationToken。 E.g。
inputStream.Select(n => Observable.Create<int>((observer, token) => Task.Run(() =>
{
while (!token.IsCancellationRequested)
{
Thread.Sleep(TimeSpan.FromSeconds(1));
observer.OnNext(n * n);
}
observer.OnCompleted();
})))
.Switch()
.Subscribe(Console.WriteLine);
在您的任务中,您需要调用OnNext
来生成值。任务的返回值(如果有)将被忽略。