Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用剪贴板的C#多线程应用程序_C#_Multithreading_Clipboard - Fatal编程技术网

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

使用剪贴板的C#多线程应用程序,c#,multithreading,clipboard,C#,Multithreading,Clipboard,我正在处理一个多线程应用程序,我面临着必须使用剪贴板的问题(我正在处理Qlikview API,我需要将表复制到excel中),问题是我认为会发生如下情况: 在线程#1上,我打开QW文档并复制表,在我将其粘贴到excel工作表之前,线程#2出现并使用剪贴板从其文档复制表。我很好奇是否可以从多线程应用程序中使用剪贴板?我读过关于使用剪贴板的各种各样的东西,唯一清楚的一点是,我理解它的方法必须是STA(?)。所以我现在有点困惑。谢谢因为剪贴板是共享资源,所以您需要非常小心。thread1中的操作很可

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

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

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


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

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

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

然后使用

lock (MyLock)
{
    // Locked Code
}
现在,锁中最多只能有一个线程运行代码

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


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

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

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

问候,


布鲁诺·科斯塔。

你试过了吗?你有错误吗?请发布一些代码,如果可能的话,我会避免用这种方式使用剪贴板。在没有剪贴板的情况下,是否无法使用Qlikview API获取数据?如果是这样,您完全可以使用Excel automation interops直接将数据插入工作表,而无需借助剪贴板。我受限于API提供的导出功能。目前,我将所有表导出为xml文件,然后计划将它们反序列化为数据表。。然后使用openXML创建excel。这似乎是一个非常紧凑的计划,直到我意识到使用这种方法不仅会使格式化变得松散,而且会使重要的行和列(对于具有行跨度和列跨度的复杂表)变得松散——qlikview在导出后不会提供准确的XML。它还可以导出到Excel,但是没有模板化的可能性,也不可能在同一个Excel文件中导出多个表谢谢Chris,你强调了一些非常好的观点。不,我还没有开始这样做,因为我预计这可能是不可能的——尽管我没有意识到所有的影响。祝您有个美好的一天!
lock (MyLock)
{
    // Locked Code
}