BackgroundWorker со строкой загрузки Webclient

Поэтому в основном я хочу получить содержимое файла.txt в Интернете и записать его в ярлык. Однако, хотя, пока это происходит, Windows Forms зависает.

Поэтому я подумал о том, чтобы поместить его в BackgroundWorker. Существует также индикатор выполнения, который должен быть заполнен во время выполнения. Мой код выглядит так:

private void RetrieveTxt(string currentversion)
    {
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    }

void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        WebClient wc = new WebClient();
        label1.Text = wc.DownloadString("http://example.org/version.txt");
    }

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        updateProgress.Value = e.ProgressPercentage;
    }

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        updateProgress.Visible = false;
    }

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

Любая помощь приветствуется, спасибо!:)

2 ответа

Решение

Если вы используете C# 5.0, вы можете сделать следующее:

label1.Text = await client.DownloadStringTaskAsync("http://example.org/version.txt");

Это так просто.

Если нет, то вы можете использовать асинхронную поддержку WebClient; вам не нужно использовать BackgroundWorker:

WebClient client = new WebClient();
client.DownloadStringCompleted += (s, data) =>
{
    label1.Invoke(new Action(() => label1.Text = data.Result));
};
client.DownloadStringAsync(new Uri("http://example.org/version.txt"));

Что касается того, почему ваш код не работает:

  1. Ты никогда не начинал рабочего. Ты никогда не звонил worker.RunWorkerAsync();
  2. Вы получаете доступ к элементу управления пользовательского интерфейса из фоновой задачи, поэтому он просто сломается при попытке доступа к метке из DoWork обработчик. Вам нужно будет установить в качестве результата строку, WebClient возвращает, а затем установить метку в завершенном обработчике.

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

private delegate void InvokeUpdateText(String theText);
private void UpdateText(String theText)
{
    if (InvokeRequired)
    {
        try { Invoke(new InvokeUpdateText(UpdateText), theText); }
        catch { }
        return;
    }
    label1.Text = theText;
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    WebClient wc = new WebClient();
    UpdateText("http://example.org/version.txt");
}
Другие вопросы по тегам