c# - 继续代码(ContinueWith)没有被执行

标签 c#

我有以下代码,其中延续代码没有被执行。

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Konsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main starting...");

            Task.Run(async () =>
            {
                await Job1();
            })
            .ContinueWith(async t =>
            {
                await Job2();
            }).Wait();

            Console.WriteLine("Main ending...");
        }

        public static async Task Job1()
        {
            await Task.Run(() =>
            {
                for (int i = 1; i <= 2; i++)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine($"Job1 {i}");
                }
            });
        }

        public static async Task Job2()
        {
            await Task.Run(() =>
            {
                for (int i = 1; i <= 2; i++)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine($"Job2 {i}");
                }
            });
        }
    }
}

控制台输出:

Main starting...
Job1 1
Job1 2
Main ending...

我预计 Job2 也会在应用程序关闭之前执行。

最佳答案

要回答您的问题,您需要从第一个异步调用中“解开”任务,如下所示:

Task.Run(async () =>
         {
           await Job1();
         })
         .ContinueWith(async t =>
         {
           await Job2();
         })
         .Unwrap()
         .Wait();

Unwrap Documentation

不过,这里还有很多其他事情需要评论。

如果您正在使用 async/await,那么您确实应该自始至终都使用它。您的问题没有指定您使用的 C# 版本。如果您使用C# 7.1 or above ,您应该将 main 方法设置为异步方法,如下所示:

public static async Task Main()
{
  Console.WriteLine("Main starting...");
  await Job1();
  await Job2();
  Console.WriteLine("Main ending...");
}

此外,正如 @Sean 所指出的,在这些情况下 Thread.Sleep 是一个坏主意,您应该使用 wait Task.Delay(1000); 代替。 Task.Delay Documentation

可以在 MSDN 上找到一篇包含一些异步/等待最佳实践的精彩文章。也是如此。

关于c# - 继续代码(ContinueWith)没有被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60509585/

相关文章:

c# - 将 int 数组传递给存储过程的表值参数 - 转换失败

javascript - 使用 javascript 从 CefSharp 浏览器获取文本框值

c# - 正则表达式 - 如果开始匹配则匹配结束

c# - 通过 datacontract 使用 WCF Restful 服务

c# - 回发后保留以编程方式创建的 html 控件

c# - MVC按钮点击调用POST Action方法

c# - 可为空的日期时间转换

c# - 使用对通用对象的引用作为参数

c# - 物理、相对、绝对和其他路径

c# - 通过使用 xpath 在 c# 中过滤现有文档来创建新的 XMLDocument