停止并重新启动HttpListener? [英] Stopping and restarting HttpListener?
问题描述
我正在使用具有HttpListener
的应用程序.我的目标是让用户根据自己的喜好关闭和打开监听器.我将侦听器放在新线程中,但在中止该线程时遇到了问题.我在某处读到,如果您尝试中止处于非托管上下文中的线程,则一旦它重新进入托管上下文,就会触发ThreadAbortException
.看来HttpListener的GetContext()
方法是不受管的,因为当我尝试中止线程时,直到对我的应用发出Web请求之前,什么都不会发生.然后线程退出.问题是,当我尝试终止线程时,稍后可能会在同一端口上再次启动线程,并且HttpListenerException
熄灭,表明该前缀已被注册.
I am working on an app that has an HttpListener
. My goal is for the user to turn the listener off and on as they choose. I put the Listener in a new thread and I'm having a problem aborting that thread. I read somewhere that if you try to abort a thread that is in an unmanaged context, then as soon as it re-enters a managed context the ThreadAbortException
will be fired. It appears that an HttpListener's GetContext()
method is unmanaged because when I try to abort the thread nothing happens until I make a web request against my app. THEN the thread exits. The problem is when I attempt to kill the thread, I may start up the thread again later on the same port and an HttpListenerException
goes off saying that the prefix is already registered.
如何杀死交叉线程HttpListener?是否有GetContext()
的托管替代方法可以使线程中止?我可以以非托管代码停止的方式中止线程吗?
How can I kill a cross thread HttpListener? Is there a managed alternative to GetContext()
that will allow the thread to abort? Can I abort the thread in a way that unmanaged code will halt?
推荐答案
诸如此类的事情
public class XListener
{
HttpListener listener;
public XListener(string prefix)
{
listener = new HttpListener();
listener.Prefixes.Add(prefix);
}
public void StartListen()
{
if (!listener.IsListening)
{
listener.Start();
Task.Factory.StartNew(async () =>
{
while (true) await Listen(listener);
}, TaskCreationOptions.LongRunning);
Console.WriteLine("Listener started");
}
}
public void StopListen()
{
if (listener.IsListening)
{
listener.Stop();
Console.WriteLine("Listener stopped");
}
}
private async Task Listen(HttpListener l)
{
try
{
var ctx = await l.GetContextAsync();
var text = "Hello World";
var buffer = Encoding.UTF8.GetBytes(text);
using (var response = ctx.Response)
{
ctx.Response.ContentLength64 = buffer.Length;
ctx.Response.OutputStream.Write(buffer, 0, buffer.Length);
}
}
catch (HttpListenerException)
{
Console.WriteLine("screw you guys, I'm going home!");
}
}
}
用法:
var x = new XListener("http://locahost:8080");
x.StartListen();
Thread.Sleep(500); // test purpose only
x.StopListen();
Thread.Sleep(500); // test purpose only
x.StartListen();
/* OUTPUT:
=> Listener started
=> Listener stopped
=> screw you guys, I'm going home!
=> Listener started */
这篇关于停止并重新启动HttpListener?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!