c# backgroundworker не будет работать с кодом, который я хочу, чтобы он сделал
Мой код не выдает ошибок, когда я просто получаю одну, пытаясь запустить его. он говорит, что ThreadStateException не был обработан пользовательским кодом, который я искал в нескольких местах, и весь мой код выглядит так же, как я знаю, в чем проблема. вот код, который не работает
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);
}
}
}
}
Любая помощь будет оценена по достоинству
2 ответа:
Вы не можете показать форму (диалог) из 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) ...
В противном случае вы будете игнорировать ошибки.
Добавьте некоторую обработку исключений в свой метод 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 } }