Charles T. Blankenship Ответов: 1

Webclient eventhandlers не стреляет ...


Я использую следующий код, чтобы связать некоторые обработчики событий с клиентом.UploadProgressChanged и клиент.UploadFileCompletedEventHandler
try
{
    WebClient client = new WebClient();
    client.Credentials = new NetworkCredential(txtFTPUserName.Text, txtFTPPassword.Text);
    client.UploadProgressChanged += new UploadProgressChangedEventHandler(UploadProgressChangedEventArgs);
    client.UploadFileCompleted += new UploadFileCompletedEventHandler(UploadFileCompletedEventHandler);
    progBar.Visible = true;
    progBar.Value = 0;
    client.UploadFile(@"ftp://novantconsulting.com/SQLBackups/StrataFrame.bak", @"E:\Strataframe.bak");
 }
catch (Exception exception)
{
    Console.WriteLine(exception);
    throw;
}

Вот обработчик событий:
private void UploadProgressChangedEventArgs(object sender, UploadProgressChangedEventArgs e)
{
    int percentage = (Convert.ToInt32(e.BytesSent) / Convert.ToInt32(e.TotalBytesToSend)) * 100;

    if (progBar.Value < progBar.Maximum)
    {
        progBar.Value = percentage;
    }
    else
    {
        progBar.Value = 100;
    }
}


Очевидно, я пытаюсь отобразить строку состояния, но событие никогда не срабатывает.

Заранее спасибо за вашу помощь,

CTBlankenship

Что я уже пробовал:

Только то, что вы видите в коде ... Я погуглил Диккенса из него и начинаю думать, что асинхронное решение подходит ко мне. Я просто еще не сделал никакой асинхронной работы.

RickZeeland

Вы используете WPF ? это известная проблема в WPF.

Charles T. Blankenship

Нет... WinForms ...

1 Ответов

Рейтинг:
0

RickZeeland

Вам, вероятно, нужно использовать Взывать, поскольку progressbar не задается из основного потока пользовательского интерфейса, см. статью: Еще один способ вызова пользовательского интерфейса из рабочего потока[^]
Вам также может понадобиться Приложение.Функция doevents() чтобы показать обновления элемента управления.