Как использовать индикатор выполнения, когда фон занят - PullRequest
0 голосов
/ 20 ноября 2011

Я хочу установить индикатор выполнения для моего приложения.

Я использую фон для загрузки некоторых файлов с моего сервера.

Было бы неплохо, если бы я установил индикатор выполнения для этого.

Я знаю, чтобы использовать

ProgressBar.Value = 5;

и более.

но я хочу использовать индикатор выполнения. '

Я использую этот код для индикатора выполнения

private void bgDownload_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    this.downloadProgressBar.Value = e.ProgressPercentage;
}

но он не работает.

Может ли кто-нибудь сказать, как я могу это сделать.

Заранее спасибо

Ответы [ 5 ]

1 голос
/ 20 ноября 2011

Если вы выполняете обработку в фоновом режиме, пользовательский интерфейс не будет обновляться, пока не закончится.

Итак, вам нужно создать отдельный поток, в котором будет происходить обработка, и в этом потоке обновить индикатор выполнения. В главном потоке ничего не делай.

Чтобы обновить индикатор выполнения из другого потока, вам потребуется делегат (или вы получите ошибку времени выполнения).

Надеюсь, это поможет вам начать.

0 голосов
/ 20 ноября 2011

Вот пример того, как это сделать.

    public int ProgressBarPercentage { get; set; }
    public string StatusMessage { get; set; }

    public void StartDownload()
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.WorkerReportsProgress = true;
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        bw.RunWorkerAsync();
    }

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // Run clean up code here once complete (ie make sure progress bar is at 100 percent....
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker bw = sender as BackgroundWorker;

        // Download files here
        List<string> filestoget = new List<string>();
        filestoget.Add("File1");
        filestoget.Add("File2");
        filestoget.Add("File3");
        filestoget.Add("File4");
        filestoget.Add("File5");

        foreach (string file in filestoget)
        {
            // Get File

            // Report output
            int progress = 0; // add soemthing here to calculate your progress
            bw.ReportProgress(progress, string.Format("File {0} downloaded", file));
        }
    }

    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        ProgressBarPercentage = e.ProgressPercentage;
        StatusMessage = e.UserState.ToString();
    }
0 голосов
/ 20 ноября 2011

в дополнение к тому, что написал JKhuang, чтобы изменить значения в вашем индикаторе выполнения, вам нужно добавить делегат и функцию обратного вызова

delegate void SetProgCallback(int newVal);
private void SetProgressbarValue(int newVal)
{
    if (progbar.InvokeRequired)
    {
        SetProgCallback d = SetProgressbarValue;
        Invoke(d, new object[] { newVal });
    }
    else
    {
        //insert your actual code here
    }
}
0 голосов
/ 20 ноября 2011

Я предполагаю, что вы используете фоновый рабочий компонент.Таким образом, вам придется вызвать ReportProgress метод backgroundworker из его DoWork метода, который должен обновить индикатор выполнения.Ниже приведены некоторые ссылки на метод ReportProgress от MSDN:

http://msdn.microsoft.com/en-us/library/ka89zff4.aspx

0 голосов
/ 20 ноября 2011

Вы можете попробовать использовать BackgroundWorker для загрузки некоторых файлов.

Таким образом, загрузка backgroud не повлияет на вашу панель процессов.

    private void btnDownLoad_Click(System.Object sender, 
        System.EventArgs e)
    {

        // Start the asynchronous operation.
        backgroundWorkerDownLoadFile.RunWorkerAsync();
    }



    private void backgroundWorkerDownLoadFile_DoWork(object sender, 
        DoWorkEventArgs e)
    {   
        // Get the File in Server.
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...