2015-09-27 70 views
0

我创建了一个线程(或者我正在尝试),它会自动保存每隔那么多分钟。每当我点击按钮启动线程,程序就不会按照指示自动保存。所以我正在寻求帮助。下面的代码:穿线 - 困难。我究竟做错了什么?

private Thread saver; 
... 
saver.SetApartmentState(System.Threading.ApartmentState.STA); 
saver = new Thread(new ThreadStart(SaveRegularly)); 
saver.Start(); 

这里是我的SaveRegularly方法:

private bool stopAndDie = false; 
private void SaveRegularly() 
{ 
    //DateTime saveDueAt = DateTime.Now.AddMinutes(0.25); 
    //do 
    //{ 
     //Thread.Sleep(1000); 
     //if (DateTime.Now >= saveDueAt) 
    //{ 
     if (SaveDoc.FileName != "") //ADDED THIS TODAY (24/09) 
      { 
      CreateWordDocument(FilePath, SaveDoc.FileName, pathImage); 
      MessageBox.Show("Updated"); 
      return; 
      } 
     else 
      { 
      if (SaveDoc.ShowDialog() == DialogResult.OK) 
       { 
       CreateWordDocument(FilePath, SaveDoc.FileName, pathImage); 
       MessageBox.Show("New Save"); 
       return; 
       } 
      } 
      timer1.Start(); 
    } 

这是对的FormClosing事件,所以线程停止。

 stopAndDie = true; 
     saver.Join(2000); 
     timer1.Stop(); 

当我运行程序和我点击保存按钮时,收到在SaveFileDialog线(if (SaveDoc.ShowDialog() == DialogResult.OK))的误差。这里是我收到该错误。 enter image description here

+0

你打算发布错误吗?您也可以尝试将其包装起来,以便进一步查看错误消息。 – Prix

+0

我猜你正在获得交叉线程异常?这将是最好的,如果你发布错误,你正在 – Viru

+0

@Viru刚刚添加图片。 – Kayla

回答

1

将线程设置为STA模式。

saver.SetApartmentState(System.Threading.ApartmentState.STA); 

但是,如果您想定期安排某些事情,为什么不使用计时器呢? 事情是这样的:

System.Timers.Timer timer = new System.Timers.Timer(5 * 60 * 1000); 
timer.Elapsed += (s, e) => 
    { 
     //Invoke your show dialog on the UI thread here 
    }; 
timer.Start(); 

当你要它停止只是调用timer.Stop();

+0

我刚刚更新了您的建议的代码。我使用了一个计时器(timer1),并在属性窗口中设置了该值。它看起来好吗?谢谢你的帮助! – Kayla

+0

当我现在运行程序时,我在'saver.SetApartmentState(System.Threading.ApartmentState.STA);'行得到一个错误。错误说:“在FindAndReplace.exe中发生未处理的异常类型'System.NullReferenceException' 其他信息:未将对象引用设置为对象实例。 – Kayla

+0

将SetApartmentState调用向下移动一行,否则您将得到空引用异常。另外,我的意思是如果你打算使用定时器,那么你不需要所有的线程......所以,无论是把SetApartmentCall放到你的原始代码中......或者用定时器替换所有的东西 –