На самом деле было бы лучше использовать рекурсию, чтобы найти всю необходимую работу, затем настроить BackgroundWorker
, затем начать работу в нерекурсивном цикле, обновляя прогресс по мере необходимости, затем закрывая BackgroundWorker
.
То, как вы это делаете, индикатор выполнения будет перескакивать повсюду, и вы будете предоставлять ненадежную обратную связь пользователю. Они могут дойти до самого «конца» копии, а затем внезапно превратиться в очень большую структуру папок, отодвинув полосу назад к началу.
Если вы хотите продолжать делать то же, что и вы, вам нужно перенести всю подготовку BackgroundWorker
к вашему Button_Start_Click
методу, а также вызов RunWorkerAsync()
. Вы сохраняете все «кишки» существующего определения CopyFolder
DoWork
в самом CopyFolder, но вместо этого передаете ссылку на фонового работника:
backgroundWorker.DoWork += (s, args) =>
{
CopyFolder(@"C:\test", @"C:\test2", s);
};
Тогда вы можете получить CopyFolder
, который будет выглядеть примерно так:
void CopyFolder(string sourceFolder, string destFolder, BackgroundWorker worker)
{
if (!Directory.Exists(destFolder))
... // the rest is unchanged
}
Таким образом, вы только создаете и запускаете один BackgroundWorker
и просто передаете ссылку на него по дереву вызовов.