Tôi có một người biết lắng nghe:Multi-threading với Net HttpListener
listener = new HttpListener();
listener.Prefixes.Add(@"http://+:8077/");
listener.Start();
listenerThread = new Thread(HandleRequests);
listenerThread.Start();
Và tôi yêu cầu xử lý:
private void HandleRequests()
{
while (listener.IsListening)
{
var context = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
context.AsyncWaitHandle.WaitOne();
}
}
private void ListenerCallback(IAsyncResult ar)
{
var listener = ar.AsyncState as HttpListener;
var context = listener.EndGetContext(ar);
//do some stuff
}
Tôi muốn viết void Stop()
theo cách như vậy, rằng:
- Nó sẽ chặn cho đến khi tất cả các yêu cầu hiện được xử lý sẽ kết thúc (nghĩa là sẽ chờ tất cả các chuỗi "làm một số nội dung").
- Trong khi chờ đợi các yêu cầu đã bắt đầu, nó sẽ không cho phép thêm bất kỳ yêu cầu nào (ví dụ: trả lại vào đầu
ListenerCallback
). - Sau đó, nó sẽ gọi
listener.Stop()
(listener.IsListening
trở thành sai).
Làm cách nào để ghi?
EDIT: Bạn nghĩ gì về giải pháp này? Nó có an toàn không?
public void Stop()
{
lock (this)
{
isStopping = true;
}
resetEvent.WaitOne(); //initially set to true
listener.Stop();
}
private void ListenerCallback(IAsyncResult ar)
{
lock (this)
{
if (isStopping)
return;
resetEvent.Reset();
numberOfRequests++;
}
var listener = ar.AsyncState as HttpListener;
var context = listener.EndGetContext(ar);
//do some stuff
lock (this)
{
if (--numberOfRequests == 0)
resetEvent.Set();
}
}
Điều này không đúng. Nếu bạn gọi 'listener.Stop()' trong khi thực hiện 'ListenerCallback', bạn sẽ nhận được một ngoại lệ ví dụ. khi gọi 'EndGetContext' hoặc thậm chí sau, khi sử dụng luồng đầu ra. Tôi có thể bắt được ngoại lệ tất nhiên, nhưng tôi không muốn. – prostynick
Trong mã của tôi, tôi sử dụng một lá cờ và không đề cập đến người nghe nữa sau khi đã gọi dừng lại trên nó, nhưng đóng trình lắng nghe không đóng các kết nối đã được chấp nhận, chỉ là người nghe. –
Tôi không biết ý bạn là gì khi nói "Tôi sử dụng cờ". Vấn đề là, trong 'ListenerCallback' tôi đang sử dụng listener và nếu một thread khác đóng nó, trong khi tôi đang sử dụng nó, tôi sẽ kết thúc với các ngoại lệ, mà tôi đã đề cập. – prostynick