Multithreading 异步http侦听器c
我正在用C语言开发一个小型SMS服务器,并希望创建一个异步侦听器来处理发送到SMS对象用户名、消息等的请求。。我想将异步侦听器创建为类库。代码如下: 但当我按下按钮时,我只想停止侦听器-出于某种原因,listener.stop会杀死我的主UI表单ZNSMSServer。当我评论listener.Stop时,它起作用了,但我认为这不是正确的方式,我不理解为什么调用listener.Stop会对关闭产生影响?调用对象-在本例中为ZNSMSServer 如果有人曾经处理过这类问题,我将不胜感激。Multithreading 异步http侦听器c,multithreading,http,asynchronous,listener,Multithreading,Http,Asynchronous,Listener,我正在用C语言开发一个小型SMS服务器,并希望创建一个异步侦听器来处理发送到SMS对象用户名、消息等的请求。。我想将异步侦听器创建为类库。代码如下: 但当我按下按钮时,我只想停止侦听器-出于某种原因,listener.stop会杀死我的主UI表单ZNSMSServer。当我评论listener.Stop时,它起作用了,但我认为这不是正确的方式,我不理解为什么调用listener.Stop会对关闭产生影响?调用对象-在本例中为ZNSMSServer 如果有人曾经处理过这类问题,我将不胜感激。 提
提前感谢。您可能需要设置newRequest=false;调用result=listener.BeginGetContextnew AsyncCallbackListenerCallback之前,listener;否则,新请求可能永远是错误的。问题是,VS的作用是什么?我能告诉你吗?您已致电StopListener-您是否遇到异常…?您好,谢谢您的回复。这个想法加上newRequest=false;其实并不坏。我猜当你看东西很多次的时候,你会看到这样的逻辑解决方案。我会尝试并分享答案。谢谢。不用担心,尽管我认为这与你看到的坠机事件无关。
using System;
using System.Net;
using System.Threading;
namespace AListener
{
public class CAListener
{
public CAListener()
{
Thread listener = new Thread(new ParameterizedThreadStart(RequestListener));
listener.Start(new string[] { "http://*:11600/" });
}
private ManualResetEvent stopListener = new ManualResetEvent(false);
private object lockListener = new object();
private bool newRequest = false;
public void StopListener()
{
stopListener.Set();
}
public void RequestListener(object parameter)
{
string[] prefixes = parameter as string[];
HttpListener listener = new HttpListener();
foreach (string prefix in prefixes)
{
listener.Prefixes.Add(prefix);
}
listener.Start();
IAsyncResult result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
while (!stopListener.WaitOne(10))
{
lock (lockListener)
{
if (newRequest)
{
result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
newRequest = false;
}
}
result.AsyncWaitHandle.WaitOne(10);
}
listener.Close();
}
public void ListenerCallback(IAsyncResult result)
{
HttpListener listener = (HttpListener)result.AsyncState;
// Call EndGetContext to complete the asynchronous operation.
HttpListenerContext context = listener.EndGetContext(result);
HttpListenerRequest request = context.Request;
// Obtain a response object.
HttpListenerResponse response = context.Response;
// Construct a response.
string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
// Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer, 0, buffer.Length);
// You must close the output stream.
output.Close();
lock (lockListener)
{
newRequest = true;
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AListener;
namespace ZNSMS
{
public partial class ZNSMSServer : Form
{
public ZNSMSServer()
{
InitializeComponent();
}
CAListener ca = null;
private void button1_Click(object sender, EventArgs e)
{
ca.StopListener();
}
private void ZNSMSServer_Load(object sender, EventArgs e)
{
ca = new CAListener();
}
}
}