Monitor.TryEnter刚刚第一次工作

时间:2014-11-26 11:53:13

标签: c# transactions locking

我有一个AddOn,它使用SAP Business One SDK。我的AddOn有一些Threads,每个都有Transactions。 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或忘记发布什么东西?我无法完成交易,因为其他流程可能正在使用。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

你忘了释放锁定。应该像

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);
    }
}