C#timer backgroundworker用户控件

问题描述 投票:1回答:1

我有一个C#Windows窗体应用程序,它有一个名为Start Download Files的菜单,然后菜单有两个实例化的用户控件(子菜单,标签菜单)。对于每个选项卡(用户控件),我有一个下载按钮和一个每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
        }
     }
}
c# timer user-controls backgroundworker
1个回答
0
投票

对于并发访问,请使用lock

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

对于Cross-thread exception使用Invoke

Invoke(new MethodInvoker(delegate
{
      timer.Enable = true;
}));
© www.soinside.com 2019 - 2024. All rights reserved.