C# WPF:如何在线程中写入主进程拥有的流?
我想实现这个功能:当收到http请求时,创建一个新的窗口表单,等待用户输入响应文本并写入http响应流。问题是,即使使用动作委托,我也无法在线程中向流写入响应文本。一些代码如下所示: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
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库()。你说的“我不能写”是什么意思?你有错误吗?