2

RSS フィードを読み取り、それらをメイン クラスに返すクラスを作成しました。これに使用するコードは次のとおりです。

public List<Post> getLatestPosts()
{
    this.rssReader = new XmlTextReader(this.rssUrl);
    this.rssDoc = new XmlDocument();

    // Load the XML content into rssDoc
    rssDoc.Load(rssReader);

    // ... other code to parse XML ... //
}

ここで、アプリケーションを呼び出すとgetLatestPosts()、数秒間ロックアップします。これは、アプリケーションが RSS フィードを要求するのにかかる時間 (ネットワークの遅延など) が原因であると推測しています。

これを変更して、プログラムがロックアップせず、代わりに応答を待つようにしたいと考えています。メイン フォームでスレッドを使用することを考えていましたが、取得した RSS データをどのように取得するかについて混乱していますgetLatestPosts()

ボタンでこれを行う場合、メインフォームをクリックします。

private void bGetLatestPosts_Click(object sender, EventArgs e)
{
    Thread thread = new Thread(new ThreadStart(rssReader.getLatestPosts()));
}

getLatestPosts()返されるものは何もキャプチャしていません。

私はスレッドにまったく慣れていません (これはほとんどの場合、スレッドを試して学習するためにいじっているだけです) が、C# の経験はある程度あります。

ありがとう。

4

1 に答える 1

2

WinFormsアプリケーションを作成していると想定しています。レスポンシブWinFormsアプリケーションを作成するための2つの重要なルールがあります。

  • メインUIスレッドで行うことはすべて、すぐに完了するはずです。
  • メインスレッド以外のスレッドからコントロールにアクセスすることはできません。

問題を解決するには、でコードを実行しますBackgroundWorker

BackgroundWorkerクラスを使用すると、別の専用スレッドで操作を実行できます。ダウンロードやデータベーストランザクションなどの時間のかかる操作により、ユーザーインターフェイス(UI)が実行中に応答を停止したように見える場合があります。レスポンシブUIが必要で、そのような操作に関連する長い遅延に直面している場合、BackgroundWorkerクラスは便利なソリューションを提供します。

バックグラウンドで時間のかかる操作を実行するには、BackgroundWorkerを作成し、操作の進行状況を報告し、操作が終了したときに通知するイベントをリッスンします。プログラムでBackgroundWorkerを作成することも、ツールボックスの[コンポーネント]タブからフォームにドラッグすることもできます。WindowsフォームデザイナでBackgroundWorkerを作成すると、コンポーネントトレイに表示され、そのプロパティが[プロパティ]ウィンドウに表示されます。

バックグラウンド操作を設定するには、DoWorkイベントのイベントハンドラーを追加します。このイベントハンドラーで時間のかかる操作を呼び出します。操作を開始するには、RunWorkerAsyncを呼び出します。進行状況の更新の通知を受信するには、ProgressChangedイベントを処理します。操作が完了したときに通知を受け取るには、RunWorkerCompletedイベントを処理します。

これがあなたを助けるかもしれないいくつかのコードです:

private void bGetLatestPosts_Click(object sender, EventArgs e)
{
    bGetLatestPosts.Enabled = false;
    backgroundWorker.RunWorkerAsync();
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    e.Result = getLatestPosts();
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        // Handle exception...
    }
    else
    {
        List<Post> result = (List<Post>)e.Result;
        // Update GUI...
    }
    bGetLatestPosts.Enabled = true;
}
于 2012-08-25T20:59:54.277 に答える