2011-02-04 66 views
2

當我試圖運行它時,我的代碼在引人注目時沒有帶來任何錯誤。它表示ThreadStateException對於我在多個地方搜索到的用戶代碼沒有顯示出來,並且我的所有代碼看起來都以同樣的方式工作,我知道這是什麼問題。這裏要說的是心不是工作c#backgroundworker將無法與我想要的代碼一起工作

private void button1_Click(object sender, EventArgs e) 
{ 
     backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
     FolderBrowserDialog dlg2 = new FolderBrowserDialog(); 
     if (dlg2.ShowDialog() == DialogResult.OK) 
     //do whatever with dlg.SelectedPath 
     { 
      DirectoryInfo source = new DirectoryInfo(dlg.SelectedPath); 
      DirectoryInfo target = new DirectoryInfo(dlg2.SelectedPath); 

      DirectoryInfo dir = new DirectoryInfo(dlg.SelectedPath); 
      FileInfo[] fis = dir.GetFiles("*", SearchOption.AllDirectories); 
      foreach (FileInfo fi in fis) 
      { 
       if (fi.LastWriteTime.Date == DateTime.Today.Date) 
       { 
        File.Copy(fi.FullName, target.FullName +"\\"+ fi.Name, true); 
       } 
      } 

     } 
} 

任何幫助將不勝感激

回答

8

不能從withing線程顯示錶(對話)的代碼。

private void button1_Click(object sender, EventArgs e) 
{ 
    using (FolderBrowserDialog dlg2 = new FolderBrowserDialog()) 
    { 
     if (dlg2.ShowDialog() == DialogResult.OK)   
     { 
      backgroundWorker1.RunWorkerAsync(dlg2SelectedPath); 
     } 
    } 
} 


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string selectedpath = (string) e.Args; 
    .... 
} 

此外,請確保您處理完成的情況下,檢查if (e.Error != null) ...
否則你會被忽略的錯誤。

+0

代碼剛纔提出的錯誤在我的代碼,我得到一個現在說DLG2不會在目前的情況下存在。 – bobthemac 2011-02-04 15:16:15

1

將一些異常處理添加到您的DoWork方法中。

看看這裏:http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvcs/thread/74d91404-9bc8-4f8f-8eab-4265afbcb101/

string ErrorMessage = ""; 
void bgw_DoWork(object sender, DoWorkEventArgs ea) 
{ 
    //some variable declarations and initialization 
    try 
    { 
     //do some odbc querying 
     ErrorMessage = ""; 
    } 
    catch (Exception ex) 
    { 
     //stuff.. 
     ErrorMessage = ex.Message; 
    } 
} 

void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error != null || !string.IsNullOrEmpty(ErrorMessage)) 
    { 
     //do something 
     MessageBox.Show(ErrorMessage); 
    } 
    else 
    { 
     //do something else 
    } 
}