【发布时间】:2014-04-20 22:39:05
【问题描述】:
我看到有人问here 类似的问题,但它似乎不太适合我的场景。
我们有一个可以执行请求的 UI,如果用户想要再次执行请求(使用不同的查询参数),我们想要放弃初始请求,忽略其响应并仅使用最新的请求响应。
目前我有:
private readonly IDataService _dataService;
private readonly MainViewModel _mainViewModel;
private CancellationTokenSource _cancellationTokenSource;
//Constructor omitted for brevity
public async void Execute()
{
if (_cancellationTokenSource != null)
{
_cancellationTokenSource.Cancel();
}
_cancellationTokenSource = new CancellationTokenSource();
try
{
string dataItem = await _dataService.GetDataAsync(_mainViewModel.Request, _cancellationTokenSource.Token);
_mainViewModel.Data.Add(dataItem);
}
catch (TaskCanceledException)
{
//Tidy up ** area of concern **
}
}
这似乎运行良好,我有一个很好的响应式用户界面,但我有一个让我担心的场景:
- 用户发出请求
- 用户发出一个新的请求,取消了原来的请求
- 新请求在原始已取消请求引发异常之前返回,并使用当前所需的数据填充 UI
- 抛出异常并进行清理以覆盖新的请求输出
这可能非常罕见,但我认为这是一种可能性,除非我对此的理解是错误的。
有没有办法确保如果通过取消令牌请求取消任务并启动新任务,则取消发生在新任务启动/返回执行之前而不阻塞 UI 线程?
任何阅读以扩大我对此的理解将不胜感激。
【问题讨论】:
-
为什么整理会覆盖结果?在通话之前清除结果。
标签: c# .net task-parallel-library async-await