C#任务取消



我正在寻求澄清。我在Blazor服务器端应用程序中。基本上,当用户单击下拉列表中的输入字段时,我处理的是一个下拉列表保持打开的事件。我有以下代码:

private async Task HandleBlur(FocusEventArgs a)
{
tokenSource = new CancellationTokenSource();
await Task.Delay(100);
var task = Task.Run(() =>
{
show = false;
InvokeAsync(StateHasChanged);
}, tokenSource.Token);
await Task.Yield();
try
{
await task;
}
catch (AggregateException e)
{
}
}
private void HandleFocus(FocusEventArgs a)
{
tokenSource?.Cancel();
}
public void Dispose()
{
tokenSource.Dispose();
}

延迟是必要的,因为HandleFocus是在HandleBlur之后触发的。如果没有延迟,在调用tokenSource的Cancel方法之前,show变量将设置为false。我的问题是关于Task.Delay(100(的位置。如果我在任务内部或try块内部调用它,它没有任何效果,并且执行show=false,即使tokenSource.Cancel((应该停止它。

以下内容不起作用

try
{
await Task.Delay(100);
await task;
}

或者在任务本身中

var task = Task.Run(() =>
{
await Task.Delay(100);
show = false;
InvokeAsync(StateHasChanged);
}, tokenSource.Token);

我的理解是,我可以在任何给定的时间取消任务?

CancellationToken是一个协作的东西。调用Cancel()方法不会终止或中止任何操作。它只是设置令牌的IsCancellationRequested属性。您必须实现适当的逻辑,以便在任务执行期间定期查询该属性值,并根据需要对其进行响应。

内置方法实现了协作代码。例如,如果您希望取消Task.Delay(100, token)而不是Task.Delay(100)

相关内容

  • 没有找到相关文章

最新更新