如何处理用户可能会多次点击按钮并触发长时间运行的异步操作的情况。
我的想法是首先检查异步操作是否正在运行,取消它并重新启动它。
到目前为止,我已经尝试使用CancellationTokenSource来构建这种功能,但它并没有按预期工作。有时会有两个异步操作在运行,因此“旧”的异步操作尚未被取消,而我开始新操作,这会混淆结果处理。
有什么建议或示例可以处理这种情况吗?
我的想法是首先检查异步操作是否正在运行,取消它并重新启动它。
到目前为止,我已经尝试使用CancellationTokenSource来构建这种功能,但它并没有按预期工作。有时会有两个异步操作在运行,因此“旧”的异步操作尚未被取消,而我开始新操作,这会混淆结果处理。
有什么建议或示例可以处理这种情况吗?
public async void Draw()
{
bool result = false;
if (this.cts == null)
{
this.cts = new CancellationTokenSource();
try
{
result = await this.DrawContent(this.TimePeriod, this.cts.Token);
}
catch (Exception ex)
{}
finally
{
this.cts = null;
}
}
else
{
this.cts.Cancel();
this.cts = new CancellationTokenSource();
try
{
result = await this.DrawContent(this.TimePeriod, this.cts.Token);
}
catch (Exception ex)
{}
finally
{
this.cts = null;
}
}
}
编辑: 最终,我认为在短时间内运行两个异步操作并不是坏事(当新的操作被触发但旧的操作尚未被取消时)。
真正的问题在于如何向最终用户显示进度。因为当旧的异步操作结束时,它会隐藏最终用户的进度指示器,但新触发的异步操作仍在运行。
编辑2: 在DrawContent(...)中,我使用ThrowIfCancellationRequested,因此取消正在运行的任务似乎可以正常工作。
关于进度显示。当调用Draw()时,我设置加载指示器可见,当此方法结束时,我隐藏加载指示器。因此,现在当之前的异步操作在我启动新操作后被取消时,我的加载指示器被设置为隐藏。当“旧”操作结束时,我应该如何跟踪是否还有另一个异步方法正在运行。