C# 从本机代码控制第三方线程

C# 从本机代码控制第三方线程,c#,multithreading,C#,Multithreading,首先,我想说,我绝对不是线程方面的专家,这也是我提出这个问题的原因 我有一个自己开发的抽象记录器,它在任务上调度对日志提供者的调用。按如下方式运行: public void Info(string message, Exception exception) { Task.Run(() => { foreach (var p in _providers) { try

首先,我想说,我绝对不是线程方面的专家,这也是我提出这个问题的原因

我有一个自己开发的抽象记录器,它在
任务上调度对日志提供者的调用。按如下方式运行

 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;
    }  
public void调试(字符串消息,T objectToLog)
{
var model=GetLogModel(消息,toSerialize:objectToLog);
_logRepo.Create(model);//wait _logRepo.Create(model)).Result;
}  
正如您所看到的,通过注释掉的代码,我目前正在尝试一些时髦的选项来尝试同步运行。我知道我可以调用
.Result
,而无需执行下面的辅助任务,但这似乎是禁忌

我的问题是

如何使库代码同步运行,而不会无意中导致死锁或其他难以追踪的幻象问题

我假设有问题的日志提供程序在您手中,您可以操纵它。在这种情况下,您可以为第三方程序集编写装饰程序,并为异步操作生成同步方法。大多数库都有一些BeginXXX()和EndXXX()函数或类似函数。请注意此操作或某些事件,您可以使用它们来确定操作是否成功。关于此操作,存在很多问题,很难选择您想要的问题。通过谷歌搜索“c#如何同步运行异步代码”找到它们。