3

を持つアプリに取り組んでいHttpListenerます。私の目標は、ユーザーが選択したとおりにリスナーをオンまたはオフにすることです。リスナーを新しいスレッドに入れましたが、そのスレッドの中止に問題があります。管理されていないコンテキストにあるスレッドを中止しようとすると、管理されたコンテキストに再び入るとすぐに起動されることをどこかで読みましThreadAbortExceptionた。GetContext()スレッドを中止しようとしても、アプリに対して Web 要求を行うまで何も起こらないため、HttpListener のメソッドが管理されていないようです。THEN スレッドは終了します。問題は、スレッドを強制終了しようとすると、後で同じポートでスレッドを再起動しHttpListenerException、プレフィックスが既に登録されているというメッセージが表示されることです。

クロススレッドHttpListenerを強制終了するにはどうすればよいですか? GetContext()スレッドを中止できる管理された代替手段はありますか? アンマネージ コードが停止するようにスレッドを中止できますか?

4

4 に答える 4

2

次のようなものはどうですか:

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 */
于 2013-06-05T21:00:28.527 に答える