簡體   English   中英

使用剪貼板的C#多線程應用程序

[英]C# Multithread application using Clipboard

我正在研究一個多線程應用程序,我遇到了必須使用剪貼板的問題(我正在使用Qlikview API - 我需要將表復制到excel中)問題是我認為會發生什么是這樣的:在線程#1上打開QW文檔並復制表,在我將它粘貼到excel表之前,線程#2出現並使用剪貼板從其文檔中復制表。 我很好奇是否可以使用多線程應用程序中的剪貼板? 我已經閱讀了有關使用剪貼板的各種各樣的事情,我理解的唯一明確的事情是該方法必須是STA(?)。 所以我現在很困惑。 謝謝

由於剪貼板是共享資源,因此您需要非常小心。 確實很可能thread1中的操作將被thread2搶占。 您應該能夠使用關鍵部分來解決這個問題,但是......您需要考慮系統上的其他應用程序也會以難以預測的方式參與其中。 其他剪貼板監聽器將做他們的事情,可能將數據粘貼到自己,或打開剪貼板“窺視”內容。 這將阻止您快速復制/粘貼數據的嘗試,因為您可能需要等待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的下一個線程可以使用它。

希望您能像我一樣找到這個解決方案。

問候,

布魯諾科斯塔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM