运行 C# 并行任务中的 EDSDK

Running EDSDK in a parallel task in C#

这是一个概念性问题:我想在 Windows.Form 应用程序中 运行 Canon EDSDK。现在理想情况下,我想将我的数据与我的 ui 和我的模型分开。具体来说,这意味着我的 windows.form 来自我的 EDSDK 相机对象。通过四处寻找,试图让相机独立于我的表单 运行,我在此处看到了这篇帖子 EDSDK callbacks not working,它基本上描述了我最初使用 EDSDK 的经历。

所以经过进一步研究,我发现我需要以 Application.Run() 开始表单,以便接收回调的 Windows 消息。所以目前,我 运行 UI-Form 中的 EDSDK 提供了我想要的功能。我发现了一个很棒的工具箱,可以在这里找到:http://www.codeproject.com/Articles/688276/Canon-EDSDK-Tutorial-in-Csharp。 但是,我遇到了我的应用程序冻结的情况,这很可能是由于系统缺少相机回调。 (至少这是我的假设)

所以我想做的是回到我最初的想法 运行 EDSDK 在一个单独的任务中,从而能够分离原因并调试任何问题。我在其他几篇文章中看到 运行 宁多个 Application.Run() 命令是一个坏主意或坏习惯。但是,我还没有想出如何以不同方式构建我的程序结构的想法。为此,我很乐意就更好的架构提供一些意见。

此处链接文章的作者。为了彻底分离,您可以为 SDK 事件启动一个专用线程。 在我的商业图书馆中,它看起来像这样:

  • 事件循环:调用EdsGetEvent的STA线程(被锁包围)。需要在该线程调用EdsInitializeSDK才能被识别为SDK的主线程
  • Camera: 调用任何相机相关SDK函数的STA线程(被与事件循环相同的锁包围)
  • SDK 事件:将在事件循环线程上 运行。您可能希望在调用 UI 之前启动另一个线程(线程池)(因为死锁)

这样您就不会遇到死锁问题,并且 SDK 和 UI 代码完全分离。 当然这也意味着你必须使用适当的线程同步来在每个特定线程上执行函数。

我打算在有空的时候用上述更改更新 codeproject 库。