自定义超时:有没有办法知道正在执行哪行代码?

时间:2016-10-13 09:37:46

标签: c# dapper

(在生产中的二进制文件中执行哪行代码,而不是在Visual Studio中执行)

首先是我的问题的一个框架:我有一个非常难以跟踪的错误,因为它是随机发生的。在此错误中,Dapper hangs indefinitely。没有超时异常,没有什么。只有一个查询无限期执行。正如Marc Gravell在评论中回答的那样,可能是一个令人讨厌的死锁案例#34;

为了缩小问题所在的范围,我创建了这个超时功能:

/// <summary>
/// Usage:
/// var myResult = GetResultWithTimeout(() => MyFunction());
/// </summary>
public static TResult GetResultWithTimeout<TResult>(Func<TResult> func)
{
    var task = Task.Run(func);
    if (task.Wait(TimeSpan.FromSeconds(TimeoutInSeconds)))
        return task.Result;
    else
        throw new Exception($"Function timed out: {func.ToString()}");
}

我计划用这个函数包装我的_db.Query_db.Execute(很多)。我无法在调试时跟踪错误,因为它在没有可见模式的情况下每1000(?)次执行一次。这就是为什么我需要将这个包装器添加到生产中的代码中,并希望我捕获的其他信息可以帮助我找到问题。

现在,知道Dapper锁定的确切操作会更好,因此问题的标题:有没有办法知道在发生超时时正在执行哪一行代码?如果我可以在我的异常中记录此信息,这将为我提供有关Dapper中发生死锁的位置的信息。

0 个答案:

没有答案