我有以下代码,其中延续代码没有被执行。
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();
不过,这里还有很多其他事情需要评论。
如果您正在使用 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/