我在多线程应用程序中工作,我面临必须使用剪贴板的问题(我正在使用Qlikview API - 我需要将表格复制到Excel中)以及问题是我认为会发生什么是这样的: 在线程#1上,我打开QW文档并复制表格,在将它粘贴到Excel表格之前,线程#2出现并使用剪贴板从其文档复制表格。我很好奇是否可以使用多线程应用程序中的剪贴板?我已经阅读了关于使用剪贴板的各种各样的事情,并且我了解它的唯一明确的事情是该方法必须是STA(?)。所以我现在很困惑。谢谢C#使用剪贴板的多线程应用程序
回答
由于剪贴板是一个共享资源,所以您需要非常小心。 thread1中的操作确实很可能会被thread2抢占。您应该能够使用关键部分来解决这个问题,但是......您需要考虑系统中的其他应用程序也参与其中,难以预测。其他剪贴板监听器将会做他们的事情,可能将数据粘贴到自己身上,或者打开剪贴板以“偷看”内容。这会阻止您尝试快速复制/粘贴数据,因为在复制之后,您可能需要等待1000毫秒左右才能可靠地粘贴数据。 你需要考虑如果用户有一个剪贴板扩展器正在运行(你将填满你的废话)会发生什么。远程桌面怎么样?您必须等待网络上的剪贴板同步,在某些情况下,这意味着在您有机会粘贴剪贴板数据之前,您可能有另一组剪贴板监视应用程序需要检查剪贴板数据。
然后考虑剪贴板是为了方便用户,而不是作为程序员的拐杖。
如果你继续沿着这条道路走,你肯定会注定失败。这是一个糟糕的主意,不可能在没有造成附带损害的情况下实施。你应该重新考虑你的设计。不,我没有更好的想法。
谢谢克里斯,你突出了一些非常好的观点。不,我还没有开始,因为我认为这可能是不可能的 - 尽管我没有意识到所有的影响。祝你今天愉快! – Vlad
好吧,使用多线程,您可以锁定只有一个线程可以同时运行的代码部分。这通常是为了锁定不能同时访问的资源(如剪贴板示例)。
您定义以下(在这个例子中private
,所以它会在你想要把你的锁类):
private readonly System.Object MyLock = new System.Object();
然后用
lock (MyLock)
{
// Locked Code
}
现在,没有多于一个线程可以运行锁内的代码。
注意:就您的情况而言,如果其他应用程序/用户开始使用剪贴板,这可能仍会出现问题。如果可能的话,你可能想考虑使用不同于剪贴板的东西。
上一个特定的自动化工作时,我一直面临着同样的问题,前几天。 我能够通过在使用ClipBoard对象时阻止进程来克服这一点,因此如果第一个线程需要使用ClipBoard,其他人需要等待该过程完成。通过这种方式,我们可以保证在数据粘贴过程中不会出现错误行为,因为这些资源不会发生冲突。
因此,我的方法是在名为“CLIPBOARD_INUSE”的环境(Environment.SetEnvironmentVariable)中创建一个控制变量,并在特定线程需要执行ClipBoard方法时将其设置为true
。在其他线程中,while循环检查变量“CLIPBOARD_INUSE”是否为假(资源可用)(在再次检查之前使用Thread.Sleep()
)。当第一个线程完成使用ClipBoard时,通过将我们创建的控制变量重新设置为false
来释放资源,所以需要ClipBoard的下一个线程可以使用它。
希望你找到这个解决方案有帮助,因为我这样做。
Regards,
布鲁诺科斯塔。
- 1. 在ASP.NEt中使用.NET剪贴板WebForms应用程序
- 2. IOS剪贴板(复制和粘贴)不能跨应用程序
- 3. 应用程序启动时的通用剪贴板警报
- 4. 使用WP7剪贴板编程
- 5. 多线程应用程序 - C++/Debian的
- 6. 的HelloWorld多线程C#应用程序
- 7. C++中的多线程应用程序
- 8. 然而,从剪贴板线程
- 9. 使用剪贴板
- 10. 应用程序可以将剪贴板用于自己的目的吗? (阅读:谁拥有剪贴板?)
- 11. 使用线程将图像复制到剪贴板并管理线程
- 12. C多线程应用程序结构
- 13. 多线程c#应用程序
- 14. c#多线程应用程序
- 15. 如何从JavaFX应用程序读取X11剪贴板?
- 16. 如何在应用程序退出时保留剪贴板
- 17. 系统剪贴板仅在应用程序内
- 18. 当关闭flex应用程序时,它将清除剪贴板
- 19. 使用小应用程序从Mac OSX上的剪贴板抓取图像
- 20. C#应用程序线程
- 21. 多线程应用程序
- 22. 如何使用剪贴板插件与phonegap构建应用程序
- 23. SWT剪贴板数据在Windows剪贴板中不可用如果使用外壳程序
- 24. 如何在Macgap应用程序中处理从剪贴板粘贴图像
- 25. Azure PowerShell剪贴板使用
- 26. 使用Windows剪贴板
- 27. IDEA已采取行动“从剪贴板应用修补程序”。如何把补丁放到剪贴板?
- 28. UIPasteboard粘贴板应用程序iOS iPhone
- 29. 在多线程C++程序中使用std :: vector时崩溃的应用程序
- 30. 使用大型线程池调试多线程C++应用程序
你有没有试过?你有错误吗?请张贴一些代码 –
如果可能,我会避免以这种方式使用剪贴板。没有办法使用Qlikview API在没有剪贴板的情况下获取数据?如果是这样,你绝对可以使用Excel自动化interops直接插入数据到工作表中,而无需借助剪贴板。 – Baldrick
我受限于API提供的导出内容。目前我将所有表格导出为xml文件,然后我计划将它们反序列化为数据表格,然后使用openXML创建excel。看起来像一个非常紧凑的计划,直到我意识到使用这种方法不仅我松散格式化,但似乎我松散重要的行和列(对于具有rowspans和colspans的复杂表) - qlikview在导出后不提供准确的XML。它也导出到Excel,但没有模板可能性,也不可能在同一个excel文件中导出多个表格 – Vlad