C# WPF:如何在线程中写入主进程拥有的流?

C# WPF:如何在线程中写入主进程拥有的流?,c#,wpf,multithreading,stream,C#,Wpf,Multithreading,Stream,我想实现这个功能:当收到http请求时,创建一个新的窗口表单,等待用户输入响应文本并写入http响应流。问题是,即使使用动作委托,我也无法在线程中向流写入响应文本。一些代码如下所示: public partial class MainWindow : Window { private void Window_Loaded(object sender, RoutedEventArgs e) { //startup web server Dispat

我想实现这个功能:当收到http请求时,创建一个新的窗口表单,等待用户输入响应文本并写入http响应流。问题是,即使使用动作委托,我也无法在线程中向流写入响应文本。一些代码如下所示:

public partial class MainWindow : Window
{
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        //startup web server 
        Dispatcher.BeginInvoke(new Action(Start));
    }

    private void Start()
    {
        var server = new HttpServer();
        try
        {
            server.EndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
            server.Start();
            server.RequestReceived += DataProcess;
        }
        catch (Exception ex)
        {
            return;
        }
    }

    private void DataProcess(object sender, HttpRequestEventArgs e)
    {
        //create a new window in which user can input the response for the http request e.
        var pw = (PrivateWindow)Dispatcher.Invoke(new Func<HttpRequestEventArgs, PrivateWindow>(CreatePrivateWindow), e);
    }

    public PrivateWindow CreatePrivateWindow(string windowKey, HttpRequestEventArgs e)      
    {
        var pw = new PrivateWindow(); 
        pw.httpRequest = e;//pass the stream to thread here.       
        windows.Add(pw);
        return pw;    
    }
}

public partial class PrivateWindow : Window
{
    private void btnSendMessage_Click(object sender, RoutedEventArgs e)
    {
        string messageText = new TextRange(txtWriteMessage.Document.ContentStart, txtWriteMessage.Document.ContentEnd).Text.Trim(); 
        //write the response in thread           
        Dispatcher.BeginInvoke(new Action<HttpRequestEventArgs, string>(WriteToStream), httpRequest, messageText);
    }
    private void WriteToStream(HttpRequestEventArgs e, string str)
    {
        //**here occurs "stream can not be written" error.** 
        using (var writer = new StreamWriter(e.Response.OutputStream))
        {
            writer.Write(str);
        }
    }
} 
公共部分类主窗口:窗口
{
已加载私有无效窗口(对象发送器、路由目标)
{
//启动web服务器
Dispatcher.BeginInvoke(新操作(启动));
}
私有void Start()
{
var server=newhttpserver();
尝试
{
server.EndPoint=新的IPEndPoint(IPAddress.Parse(“127.0.0.1”),80);
server.Start();
server.RequestReceived+=数据处理;
}
捕获(例外情况除外)
{
返回;
}
}
私有void数据处理(对象发送方,HttpRequestEventArgs e)
{
//创建一个新窗口,用户可以在其中输入http请求e的响应。
var pw=(PrivateWindow)Dispatcher.Invoke(新函数(CreatePrivateWindow),e);
}
公共PrivateWindow CreatePrivateWindow(字符串windowKey,HttpRequestEventArgs e)
{
var pw=新的PrivateWindow();
pw.httpRequest=e;//将流传递给此处的线程。
windows.Add(pw);
返回pw;
}
}
公共部分类PrivateWindow:Window
{
私有无效btnSendMessage_单击(对象发送者,路由目标e)
{
string messageText=新文本范围(txtWriteMessage.Document.ContentStart,txtWriteMessage.Document.ContentEnd).Text.Trim();
//在线程中写入响应
Dispatcher.BeginInvoke(新操作(WriteToStream)、httpRequest、messageText);
}
私有void WriteToStream(HttpRequestEventArgs e,string str)
{
//**此处出现“无法写入流”错误。**
使用(var writer=newstreamwriter(e.Response.OutputStream))
{
writer.Write(str);
}
}
} 

很抱歉,我不知道这些类,但为什么要在响应中写入?难道你不应该阅读你得到的回应吗?再说一遍,我从来没有使用过这些类,所以这正是我在阅读您的代码后想到的。因为我想手动响应http请求。我的意思是,您启动您的服务器;你等待回应;您将在RequestReceived事件中获得一个响应,该事件包含传入的请求;但是你想写你刚刚收到的数据。我猜抛出异常是因为流是只读的,因为没有理由应该写入响应,而应该从中读取。HttpServer控件是什么,它来自哪个库?我在msdn中找不到这个类。在主窗口中,响应可以读写,HttpServer是一个三方dll库()。你说的“我不能写”是什么意思?你有错误吗?