我想首先说我绝不是线程专家,因此也就是这个问题的原因。
我有一个自制的抽象记录器,可以调度Task.Run
上的日志记录提供程序,如下所示:
public void Info(string message, Exception exception)
{
Task.Run(() =>
{
foreach (var p in _providers)
{
try
{
p.Info(message, exception);
}
catch
{
}
}
}).ConfigureAwait(false);
}
我现在遇到一个奇怪的情况,我的一个日志记录提供程序正在使用一个写入 cosmos db 的外部库,它在内部以异步方式执行此操作。
public void Debug<T>(string message, T objectToLog)
{
var model = GetLogModel(message, toSerialize: objectToLog);
_logRepo.Create(model); // << this guys is async
//var s= Task.Run(async () => await _logRepo.Create(model)).Result;
}
正如您所看到的,通过注释掉的代码,我目前正在尝试一些时髦的选项来尝试让它同步运行。我知道我可以在没有下面的辅助任务的情况下调用.Result
,但这似乎是禁忌。
我的问题是 如何使这个库代码同步运行,而不会无意中导致死锁或其他难以追踪的幻像问题?