0

WebClient オブジェクトがサイトから読み取っている間、プログラムがロードされていることを示すプログレス バーを取得しようとしています (ProgressStyle.Marquee を使用)。問題は、通話を開始するボタンをクリックすると、UI 全体がフリーズすることです。BackgroundWorker doWork に入れてみましたが、データがまったく取得されません。デリゲートとさまざまなスレッドオプションも試しましたが、すべて同じ問題があるようです。

私はC#にかなり慣れていないため、ほとんどの場合、Webで見つけた結果を試していますが、問題を解決できるものはありません。

私が持っているもの:

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
    }        
}
4

1 に答える 1

0

私の BackgroundWorker の試みを見た後、それが非同期性のポイントを無効にしており、getInfoButton_Click完了するまでメソッドが停止する (実質的に UI をフリーズする) ことに気付きました。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;
}
于 2013-04-30T06:28:29.900 に答える