我知道Task.Wait()阻塞了执行它的线程。
我是否正确地理解了Task.WaitAsync()没有这样做?
我试图找出有关这件事的信息,但什么也没找到
发布于 2022-08-23 09:56:03
WaitAsnync将返回一个需要等待的新任务。它不是用来避免await的,而是用来取消等待另一个任务的。
如果希望在不阻塞的情况下完成任务,则必须在async方法中使用async,或者在连续代码中使用ContinueWith:
async Task MyMethodAsync(Task myTask)
{
...
await myTask;
...
}此代码可以永远等待,不允许取消等待。如果您想在一段时间后停止等待,可以使用Task.WaitAsync
...
try
{
await myTask.WaitAsync(TimeSpan.FromMinute(1));
}
catch(TimeoutException)
{
//Handle the timeout
}
...或者,如果父调用通过CancellationTokenSource发出取消信号,则可能要取消等待该任务的任务。
async Task MyMethod(Task someTask,CancellationToken cancellationToken=default)
{
....
await someTask.WaitAsync(cancellationToken);
...
}发布于 2022-08-23 09:49:57
它是非阻塞的,因为它返回一个Task。见文档。
public Task WaitAsync(CancellationToken cancellationToken);
public Task WaitAsync(TimeSpan timeout);
public Task WaitAsync(TimeSpan timeout, CancellationToken cancellationToken);获取一个
Task,该Task将在此Task完成、指定的超时过期或指定的CancellationToken请求取消时完成。
实现可以找到这里
public static Task WaitAsync(this Task task, int millisecondsTimeout) =>
WaitAsync(task, TimeSpan.FromMilliseconds(millisecondsTimeout), default);
public static Task WaitAsync(this Task task, TimeSpan timeout) =>
WaitAsync(task, timeout, default);
public static Task WaitAsync(this Task task, CancellationToken cancellationToken) =>
WaitAsync(task, Timeout.InfiniteTimeSpan, cancellationToken);
public async static Task WaitAsync(this Task task, TimeSpan timeout, CancellationToken cancellationToken)
{
var tcs = new TaskCompletionSource<bool>();
using (new Timer(s => ((TaskCompletionSource<bool>)s).TrySetException(new TimeoutException()), tcs, timeout, Timeout.InfiniteTimeSpan))
using (cancellationToken.Register(s => ((TaskCompletionSource<bool>)s).TrySetCanceled(), tcs))
{
await(await Task.WhenAny(task, tcs.Task).ConfigureAwait(false)).ConfigureAwait(false);
}
}https://stackoverflow.com/questions/73456470
复制相似问题