2015-09-27 68 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放到你的原始代碼中......或者用定時器替換所有的東西 –