我在下面有一个Windows消息接收方法:
protected override void WndProc ( ref Message message )
{
if ( // some analytic logic )
{
if ( OnCmdReceived != null )
OnCmdReceived.Invoke ( message );
}
else
base.WndProc ( ref message );
}
使用invoke方法的OnCmdReceived是:
static object _locker = new object( );
private void processCmdReceived ( Message message )
{
lock ( _locker )
{
MessageBox.Show( $"Current Thread ID : {Thread.CurrentThread.ManagedThreadId}" );
}
}
结果显示,即使我没有在之前的MessageBox上单击“确定”,屏幕上也只显示一个Messagebox。所有MessageBox的ManagedThread ID都与1相同。
据我所知,如果WndProc中只有一个线程,则下一个收到的消息将等待单击“确定”并进入。或者如果存在多线程方案,则下一个方案也将在_locker
中等待,直到前一个线程完成其工作。但在这种情况下,托管ID不应该相同。
怎么会发生?我错过了什么吗?
注意:我已检查过我只将processCmdReceived
方法添加到OnCmdReceived event
一次。