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用户控件的主要内容,如果未能解决你的问题,请参考以下文章
BackgroundWorker,我怎样才能显示真正的进步? C# Winforms
c# backgroundWorker 没有引发 ProgressChanged 或 RunWorkerCompleted 事件