gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:21:00 25 4
gpt4 key购买 nike

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

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 1Job1 2Main 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com