这是设置:我正在尝试制作一个相对简单的 Winforms 应用程序,一个使用FeedDotNet库的提要阅读器。我的问题是关于使用线程池。由于 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。我记得在我玩代码的一个特殊情况下,我看到它上升到 120。这不是不正常,是吗?此外,在 Windows XP 上,我认为连接数量如此之多,某处会出现瓶颈。我对吗?
我可以做些什么来确保线程/连接的最大效率?
有所有这些问题也让我想知道这是否适合使用 Threadpool。MSDN 和其他消息来源说它应该用于“短期”任务。考虑到我的连接速度相对较快,1-2 秒是否足够“短暂”?如果用户使用 56K 拨号,一个请求可能需要 5-12 秒甚至更多时间。那么线程池也会是一个有效的解决方案吗?