使用剪贴板的C#多线程应用程序

时间:2013-11-25 12:19:34

标签: c# multithreading clipboard

我正在研究多线程应用程序,我遇到了必须使用剪贴板的问题(我正在使用Qlikview API - 我需要将表复制到excel中)问题是我认为会发生什么是这样的:     在线程#1上,我打开QW文档并复制表格,在我将它粘贴到excel表格之前,线程#2出现并使用剪贴板从其文档中复制表格。我很好奇是否可以使用多线程应用程序中的剪贴板?我已经阅读了有关使用剪贴板的各种各样的事情,我理解的唯一明确的事情是该方法必须是STA(?)。所以我现在很困惑。谢谢

3 个答案:

答案 0 :(得分:3)

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

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

如果你沿着这条道路继续前进,你肯定会注定失败。这是一个坏主意,在不造成附带损害的情况下无法实施。你应该重新考虑你的设计。不,我没有更好的想法。

答案 1 :(得分:3)

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

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

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

然后使用

lock (MyLock)
{
    // Locked Code
}

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

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

MSDN Thread Synchronization

答案 2 :(得分:0)

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

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

希望您能像我一样找到这个解决方案。

此致

Bruno Costa。