2013-04-29 4 views
0

Я пытаюсь получить индикатор выполнения, чтобы показать, что программа загружается (используя 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 
    }   
} 
+2

Опубликуйте BackgroundWorker попробовать, что это нормальный способ сделать фоновую работу в Windows Forms. – nvoigt

+0

Вы проверили, что ваш WebClient фактически завершает чтение данных? То есть «пользовательский интерфейс зависает» означает, что вам нужно подождать некоторое время, но рано или поздно вы вернетесь в свое приложение или повесили его навсегда? В последнем случае вам нужно выяснить, как сообщить, что читать нечего, прежде чем вы сможете попытаться включить операцию в рабочий поток (что, конечно же, является хорошей идеей в конце). – Matthias

ответ

0

После просмотра моей BackgroundWorker попытки я понял, что это был разгромив точку асинхронности и метод getInfoButton_Click бы быть сваливания (эффективно замораживание пользовательского интерфейса) до его завершения. Игра вокруг с BackgroundWorker еще немного мне удалось заставить его работать:

private void getInfoButton_Click(object sender, EventArgs e) 
{ 
    progressBar1.Style = ProgressBarStyle.Marquee; 
    getInfoButton.Enabled = false; 
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
    bw.RunWorkerAsync("URI Here"); 
} 

void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
     WebClient client = new WebClient(); 
     StreamReader reader = new StreamReader(client.OpenRead(e.Argument)); 
     e.Result = reader; 
} 

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    StreamReader reader = (StreamReader)e.Result; 
    while ((line = reader.ReadLine()) != null) { 
     // Do stuff 
    } 
    progressBar1.Style = ProgressBarStyle.Continuous; 
    getInfoButton.Enabled = true; 
} 
Смежные вопросы