首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Task.WaitAsync对Task.Wait

Task.WaitAsync对Task.Wait
EN

Stack Overflow用户
提问于 2022-08-23 09:44:20
回答 3查看 229关注 0票数 3

我知道Task.Wait()阻塞了执行它的线程。

我是否正确地理解了Task.WaitAsync()没有这样做?

我试图找出有关这件事的信息,但什么也没找到

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-08-23 09:56:03

WaitAsnync将返回一个需要等待的新任务。它不是用来避免await的,而是用来取消等待另一个任务的。

如果希望在不阻塞的情况下完成任务,则必须在async方法中使用async,或者在连续代码中使用ContinueWith

代码语言:javascript
复制
async Task MyMethodAsync(Task myTask)
{
   ...
   await myTask;
   ...
}

此代码可以永远等待,不允许取消等待。如果您想在一段时间后停止等待,可以使用Task.WaitAsync

代码语言:javascript
复制
...
try
{
    await myTask.WaitAsync(TimeSpan.FromMinute(1));
}
catch(TimeoutException)
{
    //Handle the timeout
}
...

或者,如果父调用通过CancellationTokenSource发出取消信号,则可能要取消等待该任务的任务。

代码语言:javascript
复制
async Task MyMethod(Task someTask,CancellationToken cancellationToken=default)
{
   ....
   await someTask.WaitAsync(cancellationToken);
   ...
}
票数 6
EN

Stack Overflow用户

发布于 2022-08-23 09:49:57

它是非阻塞的,因为它返回一个Task。见文档

代码语言:javascript
复制
public Task WaitAsync(CancellationToken cancellationToken);
public Task WaitAsync(TimeSpan timeout);
public Task WaitAsync(TimeSpan timeout, CancellationToken cancellationToken);

获取一个Task,该Task将在此Task完成、指定的超时过期或指定的CancellationToken请求取消时完成。

实现可以找到这里

代码语言:javascript
复制
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);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2022-08-23 09:53:47

是的,你是对的,WaitAsync会给你一个Task

可能对您有帮助的是,当您需要在同步方法中执行异步时,常见的方法是:

代码语言:javascript
复制
methodX().GetAwaiter.GetResult()

有关这一点的更多信息可以找到这里。尽管如此,它也可以是在僵局中结束,最好的方法当然是使用await来执行异步代码并获得结果。

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

https://stackoverflow.com/questions/73456470

复制
相关文章

相似问题

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