2013-11-25 47 views
3

我在多線程應用程序中工作,我面臨必須使用剪貼板的問題(我正在使用Qlikview API - 我需要將表格複製到Excel中)以及問題是我認爲會發生什麼是這樣的: 在線程#1上,我打開QW文檔並複製表格,在將它粘貼到Excel表格之前,線程#2出現並使用剪貼板從其文檔複製表格。我很好奇是否可以使用多線程應用程序中的剪貼板?我已經閱讀了關於使用剪貼板的各種各樣的事情,並且我瞭解它的唯一明確的事情是該方法必須是STA(?)。所以我現在很困惑。謝謝C#使用剪貼板的多線程應用程序

+0

你有沒有試過?你有錯誤嗎?請張貼一些代碼 –

+0

如果可能,我會避免以這種方式使用剪貼板。沒有辦法使用Qlikview API在沒有剪貼板的情況下獲取數據?如果是這樣,你絕對可以使用Excel自動化interops直接插入數據到工作表中,而無需藉助剪貼板。 – Baldrick

+0

我受限於API提供的導出內容。目前我將所有表格導出爲xml文件,然後我計劃將它們反序列化爲數據表格,然後使用openXML創建excel。看起來像一個非常緊湊的計劃,直到我意識到使用這種方法不僅我鬆散格式化,但似乎我鬆散重要的行和列(對於具有rowspans和colspans的複雜表) - qlikview在導出後不提供準確的XML。它也導出到Excel,但沒有模板可能性,也不可能在同一個excel文件中導出多個表格 – Vlad

回答

3

由於剪貼板是一個共享資源,所以您需要非常小心。 thread1中的操作確實很可能會被thread2搶佔。您應該能夠使用關鍵部分來解決這個問題,但是......您需要考慮系統中的其他應用程序也參與其中,難以預測。其他剪貼板監聽器將會做他們的事情,可能將數據粘貼到自己身上,或者打開剪貼板以「偷看」內容。這會阻止您嘗試快速複製/粘貼數據,因爲在複製之後,您可能需要等待1000毫秒左右才能可靠地粘貼數據。 你需要考慮如果用戶有一個剪貼板擴展器正在運行(你將填滿你的廢話)會發生什麼。遠程桌面怎麼樣?您必須等待網絡上的剪貼板同步,在某些情況下,這意味着在您有機會粘貼剪貼板數據之前,您可能有另一組剪貼板監視應用程序需要檢查剪貼板數據。

然後考慮剪貼板是爲了方便用戶,而不是作爲程序員的柺杖。

如果你繼續沿着這條道路走,你肯定會註定失敗。這是一個糟糕的主意,不可能在沒有造成附帶損害的情況下實施。你應該重新考慮你的設計。不,我沒有更好的想法。

+1

謝謝克里斯,你突出了一些非常好的觀點。不,我還沒有開始,因爲我認爲這可能是不可能的 - 儘管我沒有意識到所有的影響。祝你今天愉快! – Vlad

3

好吧,使用多線程,您可以鎖定只有一個線程可以同時運行的代碼部分。這通常是爲了鎖定不能同時訪問的資源(如剪貼板示例)。

您定義以下(在這個例子中private,所以它會在你想要把你的鎖類):

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

然後用

lock (MyLock) 
{ 
    // Locked Code 
} 

現在,沒有多於一個線程可以運行鎖內的代碼。

注意:就您的情況而言,如果其他應用程序/用戶開始使用剪貼板,這可能仍會出現問題。如果可能的話,你可能想考慮使用不同於剪貼板的東西。

MSDN Thread Synchronization

0

上一個特定的自動化工作時,我一直面臨着同樣的問題,前幾天。 我能夠通過在使用ClipBoard對象時阻止進程來克服這一點,因此如果第一個線程需要使用ClipBoard,其他人需要等待該過程完成。通過這種方式,我們可以保證在數據粘貼過程中不會出現錯誤行爲,因爲這些資源不會發生衝突。

因此,我的方法是在名爲「CLIPBOARD_INUSE」的環境(Environment.SetEnvironmentVariable)中創建一個控制變量,並在特定線程需要執行ClipBoard方法時將其設置爲true。在其他線程中,while循環檢查變量「CLIPBOARD_INUSE」是否爲假(資源可用)(在再次檢查之前使用Thread.Sleep())。當第一個線程完成使用ClipBoard時,通過將我們創建的控制變量重新設置爲false來釋放資源,所以需要ClipBoard的下一個線程可以使用它。

希望你找到這個解決方案有幫助,因爲我這樣做。

Regards,

布魯諾科斯塔。

相關問題