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 或忘记释放某些内容?我无法完成交易,因为可能正在使用另一个进程。
任何帮助将不胜感激。
你忘了释放锁。应该是这样的
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);
}
}