セットアップは次のとおりです。FeedDotNetライブラリを使用するフィード リーダーである、比較的単純な Winforms アプリを作成しようとしています。私が持っている質問は、スレッドプールの使用についてです。FeedDotNet は同期 HttpWebRequest を作成しているため、GUI スレッドをブロックしています。そのため、ThreadPool スレッドに同期呼び出しを配置し、それが機能している間に、フォームで更新が必要なコントロールを呼び出すのが最善の方法のように思えました。いくつかの大まかなコード:
private void ThreadProc(object state)
{
Interlocked.Increment(ref updatesPending);
// check that main form isn't closed/closing so that we don't get an ObjectDisposedException exception
if (this.IsDisposed || !this.IsHandleCreated) return;
if (this.InvokeRequired)
this.Invoke((MethodInvoker)delegate
{
if (!marqueeProgressBar.Visible)
this.marqueeProgressBar.Visible = true;
});
ThreadAction t = state as ThreadAction;
Feed feed = FeedReader.Read(t.XmlUri);
Interlocked.Decrement(ref updatesPending);
if (this.IsDisposed || !this.IsHandleCreated) return;
if (this.InvokeRequired)
this.Invoke((MethodInvoker)delegate { ProcessFeedResult(feed, t.Action, t.Node); });
// finished everything, hide progress bar
if (updatesPending == 0)
{
if (this.IsDisposed || !this.IsHandleCreated) return;
if (this.InvokeRequired)
this.Invoke((MethodInvoker)delegate { this.marqueeProgressBar.Visible = false; });
}
}
this
= メイン フォーム インスタンス
updatesPending
= メインフォームの volatile int
ProcessFeedResult
= Feed オブジェクトに対していくつかの操作を行うメソッド。スレッドプール スレッドは結果を返すことができないため、これはメイン スレッドを介して結果を処理する許容可能な方法ですか?
私が最も心配しているのは、これがどのようにスケールするかです。一度に最大 250 件のリクエストを試しました。私が確認したスレッドの最大数は約 53 で、すべてのスレッドが完了すると 21 に戻りました。コードをいじってみた例外的な例の 1 つを思い出すと、120 まで上昇するのを見たことがありました。普通ですよね?また、Windows XP を使用しているため、接続数が非常に多いと、どこかにボトルネックがあると思います。私は正しいですか?
スレッド/接続の最大効率を確保するにはどうすればよいですか?
これらすべての質問があると、これがスレッドプールの使用に適しているかどうかも疑問に思いました。MSDN やその他の情報源は、「短期間の」タスクに使用する必要があると述べています。比較的高速な接続を使用していることを考えると、1 ~ 2 秒の「短命」で十分ですか? ユーザーが 56K のダイヤルアップを使用していて、1 つの要求に 5 ~ 12 秒以上かかる場合はどうなるでしょうか。その場合、スレッドプールも効率的なソリューションになるでしょうか?