从不同事件处理程序调用相同方法时的不一致行为

本文关键字:不一致 方法 事件处理 程序 调用 | 更新日期: 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 ) );
    }

从不同事件处理程序调用相同方法时的不一致行为

您是否尝试将takePhotographForm.Invoke (this.Invoke)包装?有一个机会,如果它从GUI工作,那么当你为调用强制一个正确的线程时它也会工作。