Я пытаюсь получить индикатор выполнения, чтобы показать, что программа загружается (используя ProgressStyle.Marquee), в то время как объект WebClient читается с сайта. Проблема в том, что при нажатии кнопки, начинающейся с вызова, весь пользовательский интерфейс замерзает. Я попытался поместить его в BackgroundWorker doWork, но это заставляет его никогда не получать никаких данных вообще. Я также пробовал делегаты и различные варианты Thread, но у всех, похоже, такая же проблема.Выполнение пользовательского интерфейса при ожидании WebClient
Я довольно новичок в C# и в основном пытался найти результаты, которые я нашел в Интернете, но никто, кажется, не решает мою проблему.
Что у меня есть:
private void getInfoButton_Click(object sender, EventArgs e)
{
progressBar1.Style = ProgressBarStyle.Marquee;
getInfoButton.Enabled = false;
StreamReader reader = new StreamReader(client.OpenRead("URI here"));
while ((line = reader.ReadLine()) != null) {
// Do stuff
}
progressBar1.Style = ProgressBarStyle.Continuous;
getInfoButton.Enabled = true;
}
Моя попытка с BackgroundWorker
private void getInfoButton_Click(object sender, EventArgs e)
{
progressBar1.Style = ProgressBarStyle.Marquee;
getInfoButton.Enabled = false;
BackgroundWorker bw = new BackgroundWorker();
bw.DoWord += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync("URI here");
while (bw.IsBusy)
;
progressBar1.Style = ProgressBarStyle.Continuous;
getInfoButton.Enabled = true;
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
WebClient client = new WebClient();
StreamReader reader = new StreamReader(e.Argument);
while ((line = reader.ReadLine()) != null) {
// Do stuff
}
}
Опубликуйте BackgroundWorker попробовать, что это нормальный способ сделать фоновую работу в Windows Forms. – nvoigt
Вы проверили, что ваш WebClient фактически завершает чтение данных? То есть «пользовательский интерфейс зависает» означает, что вам нужно подождать некоторое время, но рано или поздно вы вернетесь в свое приложение или повесили его навсегда? В последнем случае вам нужно выяснить, как сообщить, что читать нечего, прежде чем вы сможете попытаться включить операцию в рабочий поток (что, конечно же, является хорошей идеей в конце). – Matthias