锁定在 Web 方法上的 Task.Run() 内不起作用 c#?

我使用 nhibernate 作为我的网络服务的 orm,我已经实现了一个 CustomSqlDriver。我创建 CustomSqlDriver 的原因是因为我需要获取并保存在应用程序中执行的每个查询(及其参数值)到数据库。每次发生查询(选择、更新等)时都会调用 AdjustCommand 方法并按相应的顺序调用。


public class CustomSqlDriver : SqlClientDriver {

    private static readonly log4net.ILog log = log4net.LogManager.GetLogger("CustomSqlClientDriverLogger");

    private static readonly Object _lock = new Object();


    public override void AdjustCommand(IDbCommand command)

    {

        base.AdjustCommand(command);

        var parameters = (SqlParameterCollection)command.Parameters;


        QueryType queryType = GetQueryType(command);

        string tableName = GetTableName(command.CommandText);

        string fullCommandText = GetFullQuery(command, parameters);


        Task.Run(() =>

        {

            lock (_lock)

            {

                log.Info($"Trying to save the query = {fullCommandText}");

                SaveToDb((int)queryType, fullCommandText, tableName);

            }

        });

    }

}

我需要按顺序保存每个查询,因为稍后我将在不同的 FIFO 进程中使用它们。不能在同一个线程中完成(因为它可能很慢)。如您所见,我尝试在 Task.Run() 中的静态对象上使用锁,只要对任何 webmethod 的调用是同步的,就可以工作,但如果我并行调用它们,则某些行在保存时会丢失顺序到数据库。


我不确定这是最好的方法 D:任何帮助将不胜感激。


慕工程0101907
浏览 297回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP