2016-05-26 85 views
0

我正在通過阻塞的C#Interop執行外部方法SaveCurrentDocument()。該方法彈出一個對話框,要求用戶「另存爲」。我需要自動在此窗口中輸入內容,然後按確定。我的問題是阻止方法。所以我不能做到以下幾點:在執行阻塞方法期間強制返回控制

SaveCurrentDocument(); // this is blocking 
SendKeys(savePath); 
SendKeys("{ENTER}"); 

如何從阻塞方法強制返回控制?我目前的計劃是啓動BackgroundWorker並在其回調中執行該方法,從而阻止工作人員,但不阻止我的主線程。有沒有更好的辦法?

回答

2

我不認爲你可以在C#中的同一線程中打破阻塞調用。 問題是,BackgroundWorker的CancelAsync()實際上並不會停止worker或其當前方法,它會發送一個信號表示應該停止該活動,並且如果您處於interop阻止調用中,則不會打通。

雖然不是很理想,但您可以將互操作調用委託給BackgroundWorker內的單獨線程,同時保持方便的句柄。 不幸的是,我幾乎不知道SendKeys,所以我無法幫到你。就像M. Francis指出的那樣,你可能最好的方法是檢查你是否可以得到一個C#解決方案來編寫文件(如果它是像xlsx,docx,pdf,xml這樣的標準格式,或者是一個公平的大量收集其他人),並使用標準化的解決方案來保存文件。

0

我強烈建議你不要使用SendKeys。如果我在調用這個程序時使用了另一個程序,或者有另一個窗口處於活動狀態,則這些鍵將發送給我正在執行的任何操作,而您的方法將無法工作。如果您要使用SendKeys,我建議不要使用依賴於需要用戶輸入輸入的彈出窗口的SaveCurrentDocument。嘗試使用StreamWriter或類似軟件,以避免需要彈出窗口。如果您使用的是SaveFileDialog,也可以設置FileName屬性。