我试图理解用C#撰写的一段代码:
static Semaphore _transactionReceived;
static TransactionsSession _transactionsSession;
static void StartTransactionsStream()
{
WriteNewLine("Starting transactions stream ...");
_transactionsSession = new TransactionsSession(AccountID);
_transactionReceived = new Semaphore(0, 100);
_transactionsSession.DataReceived = OnTransactionReceived;
_transactionsSession.StartSession();
bool success = _transactionReceived.WaitOne(10000);
if (success)
WriteNewLine("Good news!. Transactions stream is functioning.");
else
WriteNewLine("Bad news!. Transactions stream is not functioning.");
}
但我无法理解代码周期中发生的与Sempahore
类有关的事情,特别是以下几行正在做的事情:
_transactionReceived = new Semaphore(0, 100);
和
_transactionReceived.WaitOne(10000)
是在做。
我已经查看并(重新)查看了System.Threading.Semaphore
档案,我看到建构式“初始化信号量类的新实体,指定初始条目数和最大并发条目数”。 但是有0
条目是什么意思呢?
此外,我看到WaitOne(int32)
呼叫“阻塞当前执行绪,直到当前 WaitHandle 收到信号,使用 32 位有符号整数指定时间间隔(以毫秒为单位)。” 但同样,这WaitOne
在代码回圈的背景关系中意味着什么?
关于这是如何执行的任何指标或一般评论都会有所帮助。非常感谢!
uj5u.com热心网友回复:
正是这样;在Semaphore
目前还没有项目了最大的100。
如果你Semaphore
用 with构造了new Semaphore(1, 100);
,那么就会有 1 个条目,另外还有 99 个。
需要Semaphore.Release()
有 100 个剩余条目。
如果Semaphore
有可用条目,即当前条目数不是 100,则它true
立即回传。
否则,它会阻塞当前执行绪,直到一个条目可用(可能由另一个执行绪呼叫Semaphore.Release()
),此时该方法回传true
。
如果您指定 a int millisecondsTimeout
,则这是Semaphore
will 阻止并等待条目被释放的最长时间。
如果超过该超时,则该方法回传false
。
uj5u.com热心网友回复:
信号量说明
ASemaphore
是一个同步物件,它允许在代码段中进行有限程度的并行。
为简单起见,假设您正在代码块(没有共享实体、全域变量或其他邪恶)上实体化一个全新的信号量。由于多个执行绪可以同时执行同一段代码,信号量保证只有x
它们中的一个可以同时执行同一个块。
将执行绪视为工人。并非巧合,执行绪通常被称为作业执行绪。
信号量处于红色状态,因此在某个执行绪解锁信号量之前,没有人可以执行特定的代码部分。您可以创建一个 GUI,其中多个执行绪为相同的操作竞争,但是通过按下按钮,您可以解锁信号量并允许一个执行绪运行。
这意味着发生以下情况之一:
- 信号量处于绿色状态,即有许可。执行绪不等待,信号量递减,操作继续
- 信号量处于红色状态,即没有可用的许可
- 无论是
WaitOne
等待10秒(10000ms),因为没有许可证是在这段时间内可用 - 或者其他人解锁信号量和呼叫的执行绪
WaitOne
是好的
- 无论是
关于你的代码
必须有一些其他方法可以释放信号量,但在示例中未显示。事实上,你有一个红色的信号量在那里等待,但显然没有人释放它。我相信这两行之一隐藏了一个Semaphore.Release
方法
_transactionsSession.DataReceived = OnTransactionReceived;
_transactionsSession.StartSession();
0 评论