c# - 为什么我的 TCS 不等待?

标签 c# .net async-await task-parallel-library taskcompletionsource

async 关键字do 导致 CIL更改(即使方法内部没有 await),但主要是为了允许 await 出现。

但我没想到会发生以下情况:

static void Main(string[] args)
{
    Task t = Go();
    t.Wait();
}

static async Task Go()
{
    Console.WriteLine(1);
    await AAA(3000);
    Console.WriteLine(2);
}


static  Task<object> AAA(int a) // <--- No `async`
{
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
    Task.Delay(a).ContinueWith(b => tcs.SetResult(null));
    return tcs.Task;
}

这个打印:

1
(wait)
2

但是如果我改变

static  Task<object> AAA(int a) 

static async  Task<object> AAA(int a) 

它打印:

1
2
(no wait)

问题

为什么我看不到延迟? TCS 仅在三秒后解析。同时,任务没有解决,需要等待。

最佳答案

没有 async您返回的关键字 TaskCompletionSource的任务来自 AAA所以你等待它完成(这将在延迟完成后发生)。

但是,当您添加 async关键字 ,该方法返回的任务是同步完成的状态机任务。该任务内部有(结果)TaskCompletionSource。的任务,但这不是您正在等待的任务。

如果您希望该方法等待 TaskCompletionSource的任务你可以等待 Task<Task> 的内部任务:

await ((Task) await AAA(3000));

或者等待TaskCompletionSource而不是返回它:

async Task AAA(int a)
{
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
    Task.Delay(a).ContinueWith(b => tcs.SetResult(null));
    await tcs.Task;
}

或者更好,只是等待 Task.Delay本身:

async Task<object> AAA(int a)
{
    await Task.Delay(a);
    return null;
}

关于c# - 为什么我的 TCS 不等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32785678/

相关文章:

java - Outlook 日历与 Java Web 服务的连接

c# - 使用哪个 Micro ORM?

c# - 使用 LINQ 时避免代码重复

c# - AsyncLocal 的语义与逻辑调用上下文有何不同?

c# - 在 C# 中以异步方式发送 5000 条消息

c# - 将文本框中的数据写入文本文件

c# - WPF TreeView : Skip a Level

c# - 如何在 Application Insights 中为 Web 作业设置警报并在 Web 作业失败时获取通知

c# - Microsoft.Phone.ni.dll 中的 UnauthorizedAccessException

c# - 在直接从调用另一个库返回任务的库中使用 ConfigureAwait(false) 是否有利?