2016-04-27 33 views
1

我有一個應用程序試圖打開SaveFileDialog時崩潰。我搜索了答案,發現我需要把它放在一個新的線程中,這就是我所做的,但是我對STA有一個錯誤。所以我把線程對於正在執行的操作處於無效狀態。 c#

th.SetApartmentState(ApartmentState.STA); 

幾個問題後,我設法使線程工作,但現在我有

主題是對操作的無效狀態中執行。

這是我的線程函數:

public static void ouvrir(object name) 
{ 
    saveFileDialog1.Filter = "Microsoft Word Document (.docx)|*.docx"; 
    saveFileDialog1.RestoreDirectory = true; 
    saveFileDialog1.Title = "Where to save the " + (string)name + " ? "; 
    DialogResult result = saveFileDialog1.ShowDialog(); 
    oke = true; 
    try 
    { 
     if (result == DialogResult.OK) 
     { 
      boule = true; 
      ptth = saveFileDialog1.FileName; 
     } 
    } 
    catch (Exception exc) 
    { MessageBox.Show(exc.Message); } 
} 

此行thows錯誤(我保存Word文檔用互操作):

doc.SaveAs(imp); 

我GOOGLE了錯誤,但似乎我是地球上唯一存在這個問題的人......這是我的理解,我在一個懷疑和無知的海洋中航行。

謝謝

+1

你調用從後臺線程保存對話框? – bashrc

+0

我不這麼認爲,我嘗試了新的線程,然後我試着用新的線程中止並且都沒有工作 – UnderPaidIntern

+0

如果您發現自己創建了一個新線程並將其設置爲公寓狀態,那通常表明您是從錯誤的地方開始。即你在編寫這個代碼的時候應用了哪些類型的應用?它實際上是一個Forms/WPF應用程序嗎? –

回答

1

,您必須出示您用來創建窗體在同一線程上的對話,所以你不應該在這裏使用一個線程在所有。如果需要從輔助線程調用保存對話框,請使用Invoke方法在UI線程上執行代碼。

例子:How to update the GUI from another thread in C#?

下面是從MSDN一些更多的信息:Control.InvokeRequired Property

+0

感謝拖動,實際上我試圖只是把_var線程=新Func (()=> {返回Thread.CurrentThread;}​​)。 thread.SetApartmentState(ApartmentState.STA); _ 但它似乎沒有解決崩潰..它可以來自另一件事?因爲這款應用程序適用於除了一臺以外的所有計算機,而這些計算機在發生崩潰時都會發生。 – UnderPaidIntern

+0

它是Dag,而不是Drag :)。不知道你在這裏試圖做什麼,或者你爲什麼要改變公寓類型?所有UI操作應該在主線程上運行,您應該只使用工作線程來執行後臺任務,如計算,下載,數據庫訪問等。 – EventHorizon

+0

我試圖修復saveFileDialog打開時的崩潰。爲此,每個人都告訴我把它放在另一個線程中。但是,當我這樣做時,我有錯誤:「當前的線程必須設置爲單線程單元(STA)模式才能進行OLE調用。確保您的Main函數具有標記的STAThreadAttribute。僅當調試器爲附加在流程上「。所以我把它放在STA中,然後我出現了這個錯誤「Thread正在執行的操作處於無效狀態。」你現在明白了麼? – UnderPaidIntern

相關問題