Mam komponent, który przetwarza wiele żądań sieciowych w osobnym wątku. Każde przetwarzanie WebRequest jest synchroniczne.Lepsze podejście do zarządzania wieloma 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
}
}
Teraz muszę znaleźć optymalny sposób anulowania wszystkich wniosków.
Jednym ze sposobów jest przekonwertowanie każdego synchronicznego WebRequest na asynchroniczny i użycie WebRequest.Abort do anulowania przetwarzania.
Innym sposobem jest zwolnienie wskaźników nici i umożliwienie zginania wszystkich wątków za pomocą GC.
„allow wszystkie wątki umrzeć za pomocą GC”. Nie tak zachowują się nici. Nawet jeśli nie ma odniesienia do utworzonego wątku, wątek nadal działa. – svick
Jakie jest pytanie? – svick
tak umrą po zakończeniu przetwarzania, w moim przypadku jest to do 20 sekund – walter