这是我正在使用的代码。我想要的是当出现while循环内的代码出现的屏幕时。当屏幕消失时,我需要停止它。有人可以给我一些建议,我是否为此功能正确使用了CancellationTokenSource。我是否还需要同时执行.Dispose()和然后将其设置为null的行为,就像我在这里所做的那样?
protected async override void OnAppearing()
{
cts1 = new CancellationTokenSource();
await GetWork(cts1.Token);
}
protected override void OnDisappearing()
{
cts1.Cancel();
base.OnDisappearing();
}
public async Task GetWork(CancellationToken ct)
{
while (true)
{
if (ct.IsCancellationRequested)
break;
// do work
}
}
最佳答案
经验法则是:
任何需要取消令牌的代码都应该可以访问CancellationTokenSource
需要响应取消的任何代码都应该可以访问CancellationToken
这就是为什么大多数API代码仅接受CancellationToken
的原因-它不需要主动取消令牌本身,只需要注意何时被其他对象取消即可。
因此,在您的情况下,OnDisappearing
需要访问CancellationTokenSource
,但是GetWork
可能仅需要CancellationToken
。 (我不清楚您为什么在catch块中调用Cancel
,但是您可能不需要。)
关于c# - 当我使用CancellationTokenSource时,是否传递对它的引用或对CancellationTokenSource.Token的引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54386507/