C#timer backgroundworker用户控件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#timer backgroundworker用户控件相关的知识,希望对你有一定的参考价值。

我有一个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
        }
     }
}
答案

对于并发访问,请使用lock

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

对于Cross-thread exception使用Invoke

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

以上是关于C#timer backgroundworker用户控件的主要内容,如果未能解决你的问题,请参考以下文章

C# backgroundworker使用方法

C# BackgroundWorker 的文化

BackgroundWorker,我怎样才能显示真正的进步? C# Winforms

c# backgroundWorker 没有引发 ProgressChanged 或 RunWorkerCompleted 事件

如何使用 C# BackgroundWorker 报告本机 C++ 代码的进度?

c++中timer函数怎么用?