我已经构建了一个小型相机捕捉守护程序,它使用佳能的 EDSDK 和韦恩哈特曼的 C# 包装器从附加的数码单反相机捕捉一系列图像。
takePhotograph()
当我从表单本身的测试按钮单击处理程序中调用时,捕获效果非常好且非常可靠。但是,当我尝试从 调用takePhotograph()
时socketServer_MessageReceived()
,它非常不可靠并且经常导致应用程序停止响应。跟踪调用堆栈后,看起来整个调用顺序都混乱了,最终导致 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 ) );
}