从不同事件处理程序调用相同方法时的不一致行为
本文关键字:不一致 方法 事件处理 程序 调用 | 更新日期: 2023-09-27 18:09:49
我已经构建了一个小相机捕获守护程序,它使用佳能的EDSDK和Wayne Hartman的c#包装器从附加的单反相机捕获一系列图像。
当我从表单本身的测试按钮单击处理程序调用takePhotograph()
时,捕获工作得很好,非常可靠。然而,当我尝试从socketServer_MessageReceived()
调用takePhotograph()
时,它非常不可靠,并且经常导致应用程序停止响应。在跟踪调用堆栈之后,看起来整个调用顺序都混乱了,最终导致EDSDK在过早调用EdsDownload()
时(在捕获所有图像之前)挂起。
我来自一个非多线程环境(Flex/ActionScript),并有一种预感,我只是在做一些基本错误与我的处理程序。
下面是我代码的要点:
private SocketServer socketServer;
private void initSocketServer()
{
socketServer = new SocketServer();
socketServer.Start( Convert.ToInt16( serverPortField.Text ) );
socketServer.MessageReceived += new EventHandler<SocketEventArgs>( socketServer_MessageReceived );
}
private void socketServer_MessageReceived ( object sender , SocketEventArgs e )
{
Console.WriteLine( "[CaptureDaemon] socketServer_MessageReceived() >> " + (String)e.Data );
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters( new[] { new DynamicJsonConverter() } );
dynamic obj = serializer.Deserialize( (String)e.Data , typeof( object ) );
if ( (String)obj.destinationID != "captureDaemon" )
return;
switch ( (String)obj.messageID )
{
case "capture":
takePhotograph( obj.body.successiveShotDelay , obj.body.successiveShots );
break;
}
}
private void testCaptureButton_Click ( object sender , EventArgs e )
{
takePhotograph( 500 , 4 ) );
}
您是否尝试将takePhotograph
与Form.Invoke
(this.Invoke
)包装?有一个机会,如果它从GUI工作,那么当你为调用强制一个正确的线程时它也会工作。