我想弄清楚async&await个关键词都是关于,但是输出不是我期望的.

控制台应用程序如下所示:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Foo called");
        var result = Foo(5);

        while (result.Status != TaskStatus.RanToCompletion)
        {
            Console.WriteLine("Thread ID: {0}, Status: {1}", Thread.CurrentThread.ManagedThreadId, result.Status);
            Task.Delay(100).Wait();
        }

        Console.WriteLine("Result: {0}", result.Result);
        Console.WriteLine("Finished.");
        Console.ReadKey(true);
    }

    private static async Task<string> Foo(int seconds)
    {
        return await Task.Run(() =>
            {
                for (int i = 0; i < seconds; i++)
                {
                    Console.WriteLine("Thread ID: {0}, second {1}.", Thread.CurrentThread.ManagedThreadId, i);
                    Task.Delay(TimeSpan.FromSeconds(1)).Wait();
                }

                return "Foo Completed.";
            });
    }
}

输出为:

Foo called
Thread ID: 10, Status: WaitingForActivation
Thread ID: 6, second 0.
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 6, second 1.
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 6, second 2.
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 6, second 3.
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 6, second 4.
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Thread ID: 10, Status: WaitingForActivation
Result: Foo Completed.
Finished..

我希望在方法启动后,状态从WaitingForActivation变为WaitingForActivation.

它怎么能保持这种状态并处于活动状态呢?

推荐答案

对于我的回答,值得记住的是,TPL(Task-Parallel-Library)、Task类和TaskStatus枚举是在async await关键字之前引入的,而async await关键字并不是TPL的最初动机.

在标记为async的方法的上下文中,结果Task不是表示方法执行的Task,而是表示方法继续的Task.

这只能利用几个可能的状态:

  • 取消
  • 错误的
  • RANTO补全
  • 等待激活

我知道Running看起来可能是比等待激活更好的默认值,但是这可能有误导性,因为在大多数情况下,executed的异步方法实际上并没有运行(即,它可能是await-ing其他的东西).另一种 Select 可能是给TaskStatus添加一个新值,但是对于现有的应用程序和库来说,这可能是一个突破性的变化.

所有这些都与使用Task.Run时非常不同,Task.Run是原始TPL的一部分,可以使用TaskStatus枚举的所有可能值.

如果您希望跟踪异步方法的状态,请查看IProgress(T)接口,这将允许您报告正在进行的进度.这篇博文Async in 4.5: Enabling Progress and Cancellation in Async APIs将提供关于IProgress(T)接口使用的更多信息.

.net相关问答推荐

为什么在WinForm应用程序中创建组件类椭圆会在www.example.com中没有响应

节省用户在整个应用程序中使用的Flutter

是否存在指定的(子)索引分隔符?

在 Rx 中,处理线程安全是否是消费者(IObserver)的责任?

使用 Task.WhenAll 但需要跟踪每个单独的 Task 的成功

代码访问安全是否在任何现实世界中使用?

是否可以模拟 .NET HttpWebResponse?

每第 N 个字符/数字拆分一个字符串/数字?

如何通过 LINQ 比较没有时间的 DateTime?

如何使用反射在 .NET 中调用重载方法

Visual Studio 类图不显示关系

静态方法继承的正确替代方法是什么?

读取 XML(从字符串)并获取一些字段 - 读取 XML 时出现问题

MVC4 HTTP 错误 403.14 - 禁止

.NET 的 XPath 和 XSLT 2.0?

将控制台输出镜像到文件

如何从 HashSet 中检索实际项目?

有没有一种简单的方法来判断 .NET Framework 版本?

从 Visual Studio 2015 发布 - 允许不受信任的证书

如何使用 XmlSerializer 将字符串序列化为 CDATA?