【发布时间】:2011-07-16 20:42:32
【问题描述】:
我有一个组件在单独的线程中处理多个 Web 请求。每个 WebRequest 处理都是同步的。
public class WebRequestProcessor:System.ComponentModel.Component
{
List<Worker> tlist = new List<Worker>();
public void Start()
{
foreach(string url in urlList){
// Create the thread object. This does not start the thread.
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);
// Start the worker thread.
workerThread.Start(url);
tlist.Add(workerThread);
}
}
}
public class Worker
{
// This method will be called when the thread is started.
public void DoWork(string url)
{
// prepare the web page we will be asking for
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(url);
// execute the request
HttpWebResponse response = (HttpWebResponse)
request.GetResponse();
// we will read data via the response stream
Stream resStream = response.GetResponseStream();
// process stream
}
}
现在我必须找到取消所有请求的最佳方法。
一种方法是将每个同步的 WebRequest 转换为 async 并使用 WebRequest.Abort 取消处理。
另一种方法是释放线程指针并允许所有线程使用 GC 死掉。
【问题讨论】:
-
“允许所有线程使用 GC 死掉”。这不是线程的行为方式。即使没有引用您创建的
Thread,线程仍在运行。 -
是的,他们会在完成处理后死亡,在我的情况下最多 20 秒
-
我的问题是哪种方式更好,或者还有其他选择