我有一个运行很长操作的 C# 函数应用程序,以及一个使用 AzureFunction@1 任务调用它的管道。使用此任务的方法是在新线程中启动函数实际工作,立即向管道返回函数已开始工作的响应,然后启动管道倒计时。
该函数的第一个实现使用了单个线程,然后一切都按预期工作,至少在日志方面是这样。将函数转换为在新线程中完成其工作后(使用
Task.Run(()=> ... )
),首先我会在应用程序洞察中看到来自新线程的一些日志(使用ILogger
记录),但在 3 或 4 个条目之后,它就停止了,我不知道该函数是否正在运行(管道本身继续运行,等待响应)。
在新线程中写入时是否需要更改日志记录?您认为还有其他因素会影响它吗?
编辑:似乎使用 Console.Writeline 确实有效。不知道是否有助于识别问题
我的代码的伪代码来演示我在做什么:
public MyWorkingClass(ILogger日志) { _logger=日志; }
public string Run()
{
//this is not blocking so the return would be called immediately
Task.Run(() =>
{
_logger.LogInformation("starting");
... do more stuff ..
}
return "Starting task";
}
我最终所做的是在新线程中创建自己的
ILogger
,使用与我的host.json
文件中相同的配置,使用此方法:
internal static ILogger GetILogger(string loggerName)
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("host.json", optional: true, reloadOnChange: true)
.Build();
using var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConfiguration(configuration.GetSection("logging"));
builder.AddConsole();
});
var logger = loggerFactory.CreateLogger(loggerName);
return logger;
}
此方法在
Task.Run
范围开始时调用,返回的记录器工作正常,包括记录到应用程序洞察。