我们有一个正常工作的C#Windows窗体应用程序,可以在外部事件上拍照,从以太网连接的外部硬件发送。 现在它应该由Broswser通过Web接口而不是Forms.WebBrowser控件使用。
所以我添加了一个在线程中运行的最小Web服务器:
private void WebServerThread(int port)
{
try
{
//start listing on the given port
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
tcpIpListener = new TcpListener(localAddr, (int)port);
tcpIpListener.Start();
//start the thread which calls the method 'StartListen'
Thread th = new Thread(new ThreadStart(StartListen));
th.Start();
}
catch (Exception e)
{
...
}
}
public void StartListen()
{
while (bServerRunning)
{
...
Socket mySocket = tcpIpListener.AcceptSocket();
...
data = getHtmlPageFromSequencer(dataFromClient);
SendToBrowser(data, ref mySocket);
...
}
}
打开“StartWorkAndTakePictures”-Page启动与之前相同的过程(在旧的IEBrowserControl中),显示下一页,启动摄像头,启动外部设备,发送事件,摄像头拍摄正确的时间。 到此为止,就像之前......
但未发送(或识别)Canon-SDK中的事件“Camera_SDKProgressCallbackEvent”(EDSDK.ObjectEvent_DirItemRequestTransfer = 0x00000208),图片仍然在相机上而未下载。
要清除它:与主窗口的WebBrowser-Control一起使用的相同程序工作正常 - 调用事件并下载图片。
我认为这是一个消息循环问题,但我不太熟悉C#来解决错误。
答案 0 :(得分:1)
经过多次研究后我得到了解决方案,EDSDK通过主线程发送回调,启用windows窗体消息循环。 因此,当您创建包含EDSDK和回调实现的对象时,在该线程创建它,这是一个示例
Task.Run(() =>
{
try
{
if (ConfigurationsManager.Instance.Configurations.Camera == CameraTypes.Nikon)
_cameraService = new DslrCameraService(true);
else if (ConfigurationsManager.Instance.Configurations.Camera == CameraTypes.CanonEOS1200)
_cameraService = new CanonCameraService(true);
else if (ConfigurationsManager.Instance.Configurations.Camera == CameraTypes.Multiple)
_cameraService = new MultipleCameraService(true);
}
catch (Exception ex)
{
throw ex;
}
}
}, TaskScheduler.FromCurrentSynchronizationContext())
答案 1 :(得分:0)
解决方案:
添加" Application.DoEvents();"在Loop接收来自外部硬件的命令并触发相机解决了我的问题。