【发布时间】:2021-12-23 16:43:19
【问题描述】:
我正在尝试理解用 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.Semaphoredocumentation,并且我看到构造函数 “初始化 Semaphore 类的新实例,指定初始条目数和最大并发条目数." 但是当有0 条目时这意味着什么?
另外,我看到WaitOne(int32)调用“阻塞当前线程,直到当前WaitHandle接收到信号,使用32位有符号整数来指定时间间隔,以毫秒为单位。”但是再次,WaitOne 在代码周期的上下文中意味着什么?
任何关于如何执行的指针或一般 cmets 都会有所帮助。 非常感谢!
【问题讨论】:
-
查看哪些其他代码段使用了相同的信号量。信号量用于同步和信令。我希望 DataReceived 处理程序是信号量的信号。
-
我假设
_transactionsSession.StartSession();获取信号量 100 次。因为 Semaphore 最多可以获取 100 次,这意味着_transactionReceived.WaitOne(10000);被阻塞,因为没有免费的请求可以让 Semaphore 授予。事务流在释放信号量一次时“正在运行”——这并不意味着操作已完成,只是很可能已经完成了 100 分之一的事情 -
关于 initialCount 解释的有用答案:stackoverflow.com/a/9363524/255259
标签: c# multithreading semaphore