You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Form1中ProgressBar始终不更新的技术问题求助

问题根源
  • 事件订阅丢失:Form1构造函数中创建的_radar实例订阅了PropertyChanged事件,但在btnDownload_Click事件里,你重新实例化了_radar = new Radar(folderToSaveImage);,这个新实例没有绑定任何事件监听逻辑,所以后续Progress属性变化时,完全不会触发Form1里的进度条更新代码。
  • 次要潜在问题:构造函数初始化_radar时,folderToSaveImage还是null,虽然Radar构造函数接收了该值,但此时Folder属性为null,可能导致后续PrepareLinks方法出现异常。
解决方案

方案一:复用原有Radar实例(推荐)

避免重复实例化Radar,而是给Radar添加可修改的Folder属性,复用构造函数中已订阅事件的实例:

  1. 修改Radar类,添加可设置的Folder属性:
private string _folder;
public string Folder 
{ 
    get => _folder; 
    set
    {
        if (_folder != value)
        {
            _folder = value;
        }
    }
}

// 调整Radar构造函数支持空参数
public Radar(string inputFolder = null)
{
    _folder = inputFolder;
}
  1. 修改btnDownload_Click事件逻辑,不再重新实例化Radar:
private async void btnDownload_Click(object sender, EventArgs e)
{
    using (FolderBrowserDialog folderDialog = new FolderBrowserDialog())
    {
        folderDialog.SelectedPath = @"C:\";
        DialogResult result = folderDialog.ShowDialog();

        if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(folderDialog.SelectedPath))
        {
            lblNextTimeDownload.Visible = false;
            btnDownload.Enabled = false;

            string selectedFolder = folderDialog.SelectedPath;
            folderToSaveImage = selectedFolder;
            // 复用原有_radar实例,更新文件夹路径
            _radar.Folder = selectedFolder;
            await _radar.ExececuteAsync();
        }
    }
}

方案二:重新实例化时重新绑定事件

如果必须重新创建Radar实例,可将事件订阅逻辑抽成独立方法,每次实例化后重新绑定:

  1. 在Form1中抽离事件订阅方法:
private void BindRadarEvents(Radar radar)
{
    radar.PropertyChanged += (sender, args) =>
    {
        switch (args.PropertyName)
        {
            case nameof(Radar.State):
                BeginInvoke((MethodInvoker)delegate
                {
                    if (radar.State == RadarState.ImageProcessed)
                    {
                        successfulDownloadsCount++;
                        var filesToProcess = Directory.GetFiles(folderToSaveImage, "*.png").Count(filePath => !filePath.Contains("_Processed"));
                        var filesProcessedAlready = successfulDownloadsCount - filesToProcess;
                        lblImagesCounter.Text = $"Images Count: {filesProcessedAlready}";
                    }
                    else if (radar.State == RadarState.ImageProcessing)
                    {
                        Text = "Radar - ImagesProcessing";
                    }
                    else
                    {
                        Text = $"Radar - {radar.State}";
                    }
                });
                break;
            case nameof(Radar.Progress):
                if (!Disposing) 
                {
                    BeginInvoke((MethodInvoker)delegate
                    {
                        _downloadProgress.Value = radar.Progress;
                    });
                }
                break;
        }
    };
}
  1. 修改Form1构造函数,使用抽离的方法绑定事件:
public Form1()
{
    InitializeComponent();

    _downloadProgress = new ProgressBar
    {
        Location = lblNextTimeDownload.Location,
        Size = lblNextTimeDownload.Size,
        Dock = DockStyle.Top,
        Value = 0,
    };
    lblImagesCounter.Text = "Images Counter: 0";

    _downloadTimer = new Timer();
    _downloadTimer.Tick += _downloadTimer_Tick;

    _radar = new Radar(folderToSaveImage);
    BindRadarEvents(_radar);
}
  1. 修改btnDownload_Click事件,重新实例化后绑定事件:
private async void btnDownload_Click(object sender, EventArgs e)
{
    using (FolderBrowserDialog folderDialog = new FolderBrowserDialog())
    {
        folderDialog.SelectedPath = @"C:\";
        DialogResult result = folderDialog.ShowDialog();

        if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(folderDialog.SelectedPath))
        {
            lblNextTimeDownload.Visible = false;
            btnDownload.Enabled = false;

            string selectedFolder = folderDialog.SelectedPath;
            folderToSaveImage = selectedFolder;
            // 重新实例化并绑定事件
            _radar = new Radar(folderToSaveImage);
            BindRadarEvents(_radar);
            await _radar.ExececuteAsync();
        }
    }
}
额外优化建议
  • 给Radar的Progress属性添加边界判断,确保值在0-100之间,避免超出ProgressBar的默认范围:
public int Progress
{
    get => _progress;
    set
    {
        var clampedValue = Math.Clamp(value, 0, 100);
        if (!Equals(_progress, clampedValue))
        {
            _progress = clampedValue;
            OnPropertyChanged();
        }
    }
}
  • 构造函数中初始化_radar时,可给folderToSaveImage设置一个默认路径,避免Folder为null导致后续方法报错。

内容的提问来源于stack exchange,提问作者Shien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:34:50