Monitor.TryEnter 只是第一次工作

本文关键字:第一次 工作 TryEnter Monitor | 更新日期: 2023-09-27 18:31:59

我有一个插件,它使用SAP Business One SDK。我的插件有一些线程,每个线程都有事务。SAP Business One SDK 仅接受一个逐个事务,如果正在使用事务,则无法启动事务。

实际上我在StartTransaction方法中有这个控件:

StarTransaction()
{
    if (!Monitor.TryEnter(syncRoot, new TimeSpan(0, 0, 0, 10)))
        throw new TimeoutException("Transaction is busy, Try Again in some seconds");
    mCompany.StartTransaction();
}
EndTransaction()
{
    try
    {
        mCompany.EndTransaction(endType);
    }
    finally
    {
        Monitor.Exit(syncRoot);
    }
}

在屏幕中,我有一个关于这个命令的陷阱(示例):

catch (TimeoutException Ex)
{
    AddOn.Mensagens.ShowStatusBarMessage('Please, try again');
}

实际上这段代码有效,但只工作一次。在此消息之后,我再次启动该过程,返回的消息将是相同的"(重试)"。

我使用了错误的 TryEnter 或忘记释放某些内容?我无法完成交易,因为可能正在使用另一个进程。

任何帮助将不胜感激。

Monitor.TryEnter 只是第一次工作

你忘了释放锁。应该是这样的

StarTransaction()
{
    if (!Monitor.TryEnter(syncRoot, new TimeSpan(0, 0, 0, 10)))
        throw new TimeoutException("Transaction is busy, Try Again in some seconds");
    // if we are here, then lock was successfully taken
    try
    {
        mCompany.StartTransaction();
    }
    finally
    {
        Monitor.Exit(syncRoot);
    }
}