Пользовательские элементы управления backgroundworker таймера C # - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть приложение C # Windows Form, в котором есть меню «Начать загрузку файлов», и в этом меню есть два экземпляра пользовательских элементов управления (подменю, меню вкладок).Для каждой вкладки (пользовательский контроль) у меня есть кнопка загрузки и таймер, который запускает ее каждые 5 минут.Я использую частного фонового работника, который создается каждый раз, когда элемент управления загружается и запускает метод для загрузки файлов.Это доставляет мне массу неприятностей, для которых я до сих пор не могу найти решение, потому что: - когда я включаю таймер для обоих элементов управления, они начинают загрузку несколько раз для каждого, и я вхожу в параллельный доступ к файлам или - межпотоковые исключения

Кто-то испытывал нечто подобное и, может быть, может дать мне подсказку?

Мой код выглядит так:

 public partial class ucGeneralInfo : UserControl
    {
      private BackgroundWorker backgroundWorker;

      private void TimerDownloadFrequency_Tick(object sender, ElapsedEventArgs e)
        {

            if (backgroundWorker.IsBusy != true)
            {
                backgroundWorker = new BackgroundWorker();
                backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
                backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
                backgroundWorker.RunWorkerAsync(Branch);

            }
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Download_Process((string) e.Argument);
        }

        private void Download_Process(string Branch)
        {
         // copying files
         // processing files
        }
     }
}

1 Ответ

0 голосов
/ 14 сентября 2018

Для одновременного доступа используйте lock.

 lock(fileLock)
 {
     wc.DownloadFileAsync (/*...*/);
 }


Для Cross-thread exception используйте Invoke.

Invoke(new MethodInvoker(delegate
{
      timer.Enable = true;
}));
...