如何解决重新进入时取消异步方法的模式
我想在重入时取消异步功能,这样工作就不会堆积起来,并防止不必要的工作。
例如我的文件扫描最多需要 8 秒,但是当我在 UI 中更改文件夹时,应该取消旧功能。
我看到了带有 CancellationToken
的示例,但在我看来,代码太多了。
我的方法是这样的,它似乎有效,但它增加了代码的混乱程度。
也许我也没有抓住会添加更多代码的 TaskCanceledException
。
private CancellationTokenSource scanFilesstate;
private IList<FileInfo> files;
private async Task ScanFilesAsync(string path)
{
// stop old running
this.scanFilesstate?.Cancel();
this.scanFilesstate?.dispose();
this.scanFilesstate = new CancellationTokenSource();
this.files = await FileHandler.ScanFilesAsync(path,this.scanFilesstate.Token);
this.scanFilesstate?.dispose();
this.scanFilesstate = null;
}
有更短或更好的方法吗?
是否有封装此代码的模式?
解决方法
我似乎不需要清理之后, 并提出了这种方法并包装了 CancellationTokenSource 以确保处理安全。
public class SafeCancellationTokenSource : IDisposable
{
private CancellationTokenSource state = new CancellationTokenSource();
public CancellationTokenSource State => state;
public CancellationToken Token => State.Token;
public bool IsCancellationRequested => State.IsCancellationRequested;
public void Cancel()
{
this.state?.Cancel();
this.state?.Dispose();
this.state = new CancellationTokenSource();
}
public void Dispose()
{
this.state?.Dispose();
this.state = null;
}
}
代码现在看起来像这样
private SafeCancellationTokenSource scanFilesState = new SafeCancellationTokenSource();
private IList<FileInfo> files;
private async Task ScanFilesAsync(string path)
{
this.scanFilesState.Cancel();
this.files = await FileHandler.ScanFilesAsync(path,this.scanFilesState.Token);
}
编辑: 再次添加了对 Dispose() 的调用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。