首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#任务取消

C#任务取消
EN

Stack Overflow用户
提问于 2021-04-16 16:38:49
回答 1查看 75关注 0票数 1

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

代码语言:javascript
复制
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()应该已经停止了它。

以下代码不起作用

代码语言:javascript
复制
    try
    {
        await Task.Delay(100);
        await task;
    }

或者在任务本身中

代码语言:javascript
复制
    var task = Task.Run(() =>
    {
        await Task.Delay(100);
        show = false;
        InvokeAsync(StateHasChanged);
    }, tokenSource.Token);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-16 17:00:57

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

内置方法实现了协作代码。如果你想取消它,你应该调用Task.Delay(100, token)而不是Task.Delay(100)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67121876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档