【问题标题】:C# timer backgroundworker user controlsC# timer backgroundworker 用户控件
【发布时间】:2018-09-14 05:51:34
【问题描述】:

我有一个 C# Windows 窗体应用程序,它有一个名为“开始下载文件”的菜单,然后这个菜单有两个实例化的用户控件(子菜单、选项卡菜单)。 对于每个选项卡(用户控件),我都有一个下载按钮和一个每 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
        }
     }
}

【问题讨论】:

  • 也许使用 TPL 数据流
  • 问题是我有相同的控件实例化了两次,并且那里的线程正在混合......

标签: c# timer user-controls backgroundworker


【解决方案1】:

对于并发访问,请使用lock

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


对于Cross-thread exception,请使用Invoke

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

【讨论】:

  • 感谢您的回复,我很好奇我的代码有什么问题导致后台工作程序运行两次或多次以获取相同的控件,或者每次都创建新的控件?关于锁,我认为这是一种解决方法而不是解决方案,解决方案将运行一次。
  • 也许我理解你的问题。在你的标签之外,你只做一个后台工作人员做什么。然后只有一个 bg worker 会工作,如果它很忙,其他人不能下载直到它没有结束,不会发生并发文件访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多