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"));
Что касается того, почему ваш код не работает:
- Ты никогда не начинал рабочего. Ты никогда не звонил
worker.RunWorkerAsync();
- Вы получаете доступ к элементу управления пользовательского интерфейса из фоновой задачи, поэтому он просто сломается при попытке доступа к метке из
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");
}