【发布时间】:2021-04-16 08:38:48
【问题描述】:
我正在寻求澄清。我在 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);
我的理解是我可以在任何给定时间取消任务?
【问题讨论】:
-
如果你想取消延迟,你也需要将令牌传递给它。
await Task.Delay(100, tokenSource.Token); -
Task.Yield有什么作用,您希望通过使用它实现什么? -
@Fildor 这不是我的意思。我将澄清我的问题:延迟是必要的,因为
HandleFocus是在HandleBlur之后触发的。如果没有延迟,则在调用 tokenSource 的 Cancel 方法之前将 show 变量设置为 false。我的问题是关于Task.Delay(100)的位置。如果我在任务内或 try 块内调用它,它没有任何效果,并且show = false被执行,即使tokenSource.Cancel()应该停止它 -
所以,你是说你有时间问题,不是吗?
-
@Fildor 可以归结为这一点。
标签: c# task task-parallel-library blazor