이 하나가 저를 곤혹스럽게합니다. 엔터프라이즈 용 소프트웨어 설치를 돕기 위해 만든 간단한 유틸리티가 있습니다.C# BackgroundWorker_DoWork는 일부 작업 만 수행합니다.
private void backupButton_Click(object sender, EventArgs e)
{
backgroundBackup.RunWorkerAsync();
}
private void backgroundBackup_DoWork(object sender, DoWorkEventArgs e)
{
...
}
private static void CopyAll(DirectoryInfo source, DirectoryInfo target)
{
...
}
// I removed the message boxes from DoWork, and added a RunWorkerCompleted event,
// but neither the confirmation nor the error messgae box from RunWorkerCompleted are shown.
private void backgroundBackup_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
...
}
이 작동하지만, 예상되는 결과를 생성하지 않습니다 : 하나 개의 구성 요소의 AppData 현재 사용자가 파일을 자신의 컴퓨터에 가지고 있으며, 바탕 화면에 폴더에 저장합니다 백업합니다. 각 사용자가 백업하는 전체 파일 크기가 GB 또는 2에 가까워지기 때문에이 작업을 백그라운드 스레드에 넣었습니다. 이 작업을 실행할 때마다 대상의 일부 파일 및 폴더가 대상에 복사되지만 일부는 복사 될 때마다 달라집니다. 때로는 소수의 파일과 폴더 만 복사되는 경우가 있습니다. 거의 모든 것이 모두 복사되지만 전체 대상은 복사되지 않습니다. 이 작업을 간단한 콘솔 앱에 배치하면 매번 작동합니다. DoWork 메서드에서 모든 작업을 수행하지 못하게하는 BackgroundWorker 클래스에 대해 알아야 할 사항이 있습니까?
는편집 :
나는 내가 BackgroundWorker 구성 클래스 문제를 복잡하게 걸쳐있을 수 있습니다 생각합니다. 나는 동료에게 말씀, 그들은 잠재적으로 긴 과정 처리하기 위해 새 스레드를 만드는 간단한 방법 제안 : 이것은 나를 위해 수행 할 작업이 도착
을private void backupButton_Click(object sender, EventArgs e)
{
Thread backupThread = new Thread(backupThreadJob);
backupThread.Start();
}
private void backupThreadJob()
{
try
{
//copy files and stuff
}
catch(Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}
; BackgroundWorker를 사용하려는 시도에서 실패했고 일부 파일 만 복사되는 이유를 알 수 없었습니다. 모두의 도움에 감사드립니다!
몇 가지 예외가 제기되고 있지만 백그라운드 스레드에서 호출하고 기본 UI 스레드가 아니라기 때문에 메시지 상자가 표시되지 않습니다.UI 스레드에서 이러한 메서드를 호출해야합니다. –
나는 UI 스레드가 아니기 때문에 예외가 있으며 메시지 상자가 표시되지 않을 것으로 예상됩니다. 대신 예외를 기록하려고 시도하고 일반적으로 모든 예외를 사용하지 마십시오. 그것은 아마도 지금까지 깨달은 것처럼 디버깅을 악몽처럼 만듭니다. –
catch 블록에있는 MessageBox를 본 적이 있습니까? 백그라운드 스레드에서 하드 코딩 된 예외를 throw하여 메시지 상자가 표시되는지 확인하십시오. 내 생각 엔 당신의 프로세스가 오류를 던지고있는 것 같습니다. –