【问题标题】:C# Multithread application using Clipboard使用剪贴板的 C# 多线程应用程序
【发布时间】:2013-11-25 12:19:33
【问题描述】:

我正在开发一个多线程应用程序,我面临着必须使用剪贴板的问题(我正在使用 Qlikview API - 我需要将表格复制到 excel 中),问题是我认为会发生什么是这样的: 在线程#1 上,我打开 QW 文档并复制表格,在将其粘贴到 Excel 工作表之前,线程#2 出现并使用剪贴板从其文档中复制表格。我很好奇是否甚至可以从多线程应用程序中使用剪贴板?我已经阅读了有关使用剪贴板的各种内容,唯一清楚的一点是该方法必须是 STA(?)。所以我现在有点困惑。谢谢你

【问题讨论】:

  • 你试过了吗?你有错误吗?请发布一些代码
  • 如果可以的话,我会避免以这种方式使用剪贴板。没有剪贴板就没有办法使用 Qlikview API 来获取数据吗?如果是这样,您绝对可以使用 Excel 自动化互操作将数据直接插入工作表中,而无需借助剪贴板。
  • 我受限于 API 为导出提供的内容。目前我将所有表导出为 xml 文件,然后我计划将它们反序列化为数据表 .. 然后使用 openXML 创建 excel。似乎是一个非常紧凑的计划,直到我意识到使用这种方法不仅会丢失格式,而且似乎我会丢失重要的行和列(对于具有行跨度和列跨度的复杂表) - qlikview 在导出后不提供准确的 XML。它也可以导出到 Excel,但没有模板的可能性,也不能在同一个 excel 文件中导出多个表

标签: c# multithreading clipboard


【解决方案1】:

由于剪贴板是共享资源,因此您需要非常小心。确实很有可能thread1中的操作会被thread2抢占。您应该能够使用关键部分来解决这个问题,但是......您需要考虑系统上的其他应用程序也以难以预测的方式参与其中。其他剪贴板侦听器将做他们的事情,可能将数据粘贴到自己,或者打开剪贴板以“窥视”内容。这将挫败您快速复制/粘贴数据的尝试,因为您可能需要在复制后等待 1000 毫秒左右,然后才能可靠地粘贴它。 您需要考虑如果用户运行剪贴板扩展器会发生什么(您将用废话填充它)。远程桌面怎么样?您必须等待剪贴板通过网络同步,在某些情况下,这意味着您可能有另一组剪贴板监控应用程序急于检查剪贴板数据,然后才有机会粘贴它。

然后考虑剪贴板是为了方便用户,而不是作为程序员的拐杖。

如果你继续沿着这条路走下去,你肯定注定要失败。这是一个坏主意,并且不可能在不造成附带损害的情况下实施。你应该重新考虑你的设计。不,我没有更好的主意。

【讨论】:

  • 谢谢你,克里斯,你强调了一些非常好的观点。不,我还没有开始这样做,正如我所预料的那样,这可能是不可能的——即使我没有意识到所有的影响。祝你有美好的一天!
【解决方案2】:

好吧,使用多线程,您可以锁定只有一个线程可以同时运行的部分代码。这通常是为了锁定无法同时访问的资源(例如剪贴板示例)。

您定义以下内容(在此示例中为 private,因此它将位于您要放置锁的类中):

private readonly System.Object MyLock = new System.Object();

然后使用

lock (MyLock)
{
    // Locked Code
}

现在,只有一个线程可以运行锁内的代码。

注意:在您的情况下,如果其他应用程序/用户开始使用剪贴板,这可能仍然会出现问题。如果可能,您可能需要考虑使用与剪贴板不同的东西。

MSDN Thread Synchronization

【讨论】:

    【解决方案3】:

    几天前,我在从事特定自动化工作时遇到了同样的问题。 我可以通过在使用 ClipBoard 对象时阻塞进程来克服这个问题,因此如果第一个线程需要使用 ClipBoard,其他线程将需要等待进程完成。这样我们就可以保证在将数据粘贴到某个地方时不会出现错误行为,因为该资源不会发生冲突。

    所以,我的方法是在环境(Environment.SetEnvironmentVariable)中创建一个名为“CLIPBOARD_INUSE”的控制变量,并在特定线程需要执行剪贴板方法时将其设置为true。在其他线程中,while 循环检查变量“CLIPBOARD_INUSE”是否为假(资源可用)(在再次检查之前使用Thread.Sleep())。当第一个线程完成使用 ClipBoard 时,是时候通过将我们创建的控制变量设置回 false 来释放资源,以便下一个需要 ClipBoard 的线程可以使用它。

    希望您能像我一样发现这个解决方案有帮助。

    问候,

    布鲁诺·科斯塔。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多