2016-04-27 107 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

相关问题