C#任务取消

C#任务取消,c#,task,task-parallel-library,blazor,C#,Task,Task Parallel Library,Blazor,我在寻求澄清。我在Blazor服务器端应用程序中。基本上,我正在处理一个事件,当用户单击下拉列表中的输入字段时,下拉列表保持打开状态。 我有以下代码: private async Task HandleBlur(FocusEventArgs a) { tokenSource = new CancellationTokenSource(); await Task.Delay(100); var task = Task.Run(() => { s

我在寻求澄清。我在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之后触发的。如果没有延迟,show变量将被设置为false,然后才能调用tokenSource的Cancel方法。我的问题是关于任务的位置。延迟(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);

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

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


内置方法实现了协作代码。例如,如果你想取消任务,你应该调用
Task.Delay(100,令牌)
,而不是
Task.Delay(100)
CancellationToken
是一个合作的东西。调用
Cancel()
方法不会终止或中止任何操作。它只是设置令牌的
IsCancellationRequested
属性。您必须实现适当的逻辑,以便在任务执行期间定期查询该属性值,并根据需要对其作出响应


内置方法实现了协作代码。例如,如果要取消任务,则应调用
Task.Delay(100,令牌)
而不是
Task.Delay(100)

如果要取消延迟,还需要将令牌传递给它<代码>等待任务。延迟(100,tokenSource.Token)什么是任务。收益做的,你希望通过使用它实现什么?@Fildor这不是我的意思。我将澄清我的问题:延迟是必要的,因为
HandleFocus
是在
HandleBlur
之后触发的。如果没有延迟,show变量将被设置为false,然后才能调用tokenSource的Cancel方法。我的问题是关于
任务的位置。延迟(100)
。如果我在任务内部或try块内部调用它,它没有任何效果,并且执行
show=false
,即使
tokenSource.Cancel()
应该停止它,所以,你是说你有计时问题,不是吗?@Fildor one可以这样说。如果你想取消延迟,你需要传递令牌,也是<代码>等待任务。延迟(100,tokenSource.Token)什么是任务。收益做的,你希望通过使用它实现什么?@Fildor这不是我的意思。我将澄清我的问题:延迟是必要的,因为
HandleFocus
是在
HandleBlur
之后触发的。如果没有延迟,show变量将被设置为false,然后才能调用tokenSource的Cancel方法。我的问题是关于
任务的位置。延迟(100)
。如果我在任务内部或try块内部调用它,它没有任何效果,并且执行
show=false
,即使
tokenSource.Cancel()
应该停止它,所以,你是说你有计时问题,不是吗?@Fildor one可以将其归结为这一点。