我正在嘗試開發一個異步、多執行緒的 .NET Core 控制臺應用程式,但是在實作教程中的代碼后,一旦開始實作,代碼就會關閉
Microsoft.Hosting.Lifetime:資訊:應用程式正在關閉
開始撰寫使用異步、多執行緒執行的方法
private async Task<List<RegistrationData>> ProcessPendingRegistrationsAsync(List<RegistrationData> registrations)
{
return registrations;
}
然后我使用“Task.Run”運行這個方法
foreach (var openPendingRegistrationsData in openPendingRegistrationsPerPages)
processPendingRegistrationsTasks.Add(Task.Run(() => ProcessPendingRegistrationsAsync(openPendingRegistrationsData)
);
最后,我想使用await Task.WhenAll()以下命令等待所有任務:
if (processPendingRegistrationsTasks.Count > 0)
{
await Task.WhenAll(processPendingRegistrationsTasks);
}
Console.WriteLine("Finish running code");
為了更清楚,代碼沒有在 中列印訊息Console.WriteLine,一旦我實作了Task.WhenAll.
拜托,誰能告訴我是什么問題?
編輯
程式.cs
internal class Program
{
private static void Main(string[] args)
{
var log4NetConfiguration = new Log4NetConfiguration();
log4NetConfiguration.SetLog4NetConfiguration();
var host = CreateHostDefaultBuilder(args).Build();
host.RunAsync();
RunTask(host.Services);
}
public static IHostBuilder CreateHostDefaultBuilder(string[] args)
{
return Host.CreateDefaultBuilder()
.ConfigureAppConfiguration(app => { app.AddJsonFile("appsettings.json"); })
.ConfigureServices((_, services) =>
{
services.ConfigureDAL().ConfigureBusiness().ConfigureConnectionHelper().ConfigureTimeOutSetting();
});
}
public static void RunTask(IServiceProvider services)
{
var taskHelper = (TaskHelper)services.GetService(typeof(TaskHelper));
taskHelper?.Execute(true);
}
}
任務助手
public async Task Execute(bool forceMode)
{
var openPendingRegistrationsPerPages =
_dRegistration.GetAllRegistrationsByStatusAndSubStatusPerPage(cachedByGuid[1], cachedByGuid[2]);
foreach (var openPendingRegistrationsData in openPendingRegistrationsPerPages)
processPendingRegistrationsTasks.Add(Task.Run(() => ProcessPendingRegistrationsAsync(openPendingRegistrationsData));
}
if (processPendingRegistrationsTasks.Count > 0)
{
await Task.WhenAll(processPendingRegistrationsTasks);
}
Console.WriteLine("Finish running code");
private async Task<List<RegistrationData>> ProcessPendingRegistrationsAsync(List<RegistrationData> registrations)
{
// Process
return registrations;
}
uj5u.com熱心網友回復:
你不是在等待taskHelper.Execute(true)完成執行。
問題源于您的RunTask(...)方法:
public static void RunTask(IServiceProvider services)
{
var taskHelper = (TaskHelper)services.GetService(typeof(TaskHelper));
taskHelper?.Execute(true);
}
.Execute回傳一個Task:
public async Task Execute(bool forceMode)
除非您await無法呼叫此呼叫,因為RunTask它不是async方法,否則您的代碼將不會等待Task該方法回傳的函式完成運行。
在這種情況下,簡單的解決方案是使用Task.Wait方法等待 Task 完成執行。
這應該有效:
public static void RunTask(IServiceProvider services)
{
var taskHelper = (TaskHelper)services.GetService(typeof(TaskHelper));
taskHelper?.Execute(true).Wait();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318785.html
