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



我正在一个多线程应用程序中工作,我面临着必须使用剪贴板的问题(我正在使用Qlikwiew API-我需要将表复制到excel中),问题是我认为会发生这样的事情:在线程#1上,我打开QW文档并复制表格,在将其粘贴到excel表中之前,线程#2出现并使用剪贴板从文档中复制表格。我很好奇是否可以使用多线程应用程序中的剪贴板?我读过关于使用剪贴板的各种各样的东西,我对它唯一清楚的了解是,方法必须是STA(?)。所以我现在有点困惑。感谢

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

然后考虑这样一个事实:剪贴板是为了用户的方便,而不是程序员的拐杖。

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

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

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

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

然后使用

lock (MyLock)
{
    // Locked Code
}

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

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

MSDN线程同步

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

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

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

问候,

布鲁诺·科斯塔。

最新更新