我有一个在64位(x64)Linux平台上以单声道4.6.2运行的C#程序。我有一段简单的代码在一个单独的线程中运行:
PromptBehavior.Auto
当程序空闲时,代码工作正常,但是当程序的其他部分甚至被适度加载时,WaitAny()调用将永远阻塞,DoSomeWork()永远不会被调用。
我使用strace实用程序来查看正在发生的事情,并隔离了信号处理线程的输出,我一遍又一遍地看到这一行:
UnixSignal[] fSignals =
{
new UnixSignal(Signum.SIGINT),
new UnixSignal(Signum.SIGTERM)
};
while(!done)
{
//wait 100ms for any signal
//The mono WaitAny implementation on UnixSignal returns the timeout you requested
// instead of WaitTimeout as the rest of the known universe does:
// http://50.198.40.26/1.1/handlers/monodoc.ashx?link=M%3aMono.Unix.UnixSignal.WaitAny(Mono.Unix.UnixSignal%5b%5d%2cSystem.Int32)
int index = UnixSignal.WaitAny(fSignals, 100);
DoSomeWork();
if (index == 100)
continue; //no signal
Signum signal = fSignals[index].Signum;
//process signal
}
最后一个参数是我们指定的100ms超时。由于我没有看到任何其他值,我认为发生的是当轮询被信号中断时,例如Mono广泛使用的SIGPWR,轮询以相同的超时重新启动,直到它一次又一次地被中断。如果它经常中断,则用户进程将被阻止超过100毫秒。
这是Mono中的错误还是还有其他事情发生?
谢谢。