Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不能在线程中读写流_C#_Multithreading_Delegates - Fatal编程技术网

C# 为什么不能在线程中读写流

C# 为什么不能在线程中读写流,c#,multithreading,delegates,C#,Multithreading,Delegates,我想在线程中处理http请求,代码如下,问题是OutputStream(如代码中所述)无法写入。当我把这个进程放在主线程中时,它没有问题。你能给我一些建议吗 public partial class MainWindow : Window { private void Window_Loaded(object sender, RoutedEventArgs e) { var server = new HttpServer();

我想在线程中处理http请求,代码如下,问题是OutputStream(如代码中所述)无法写入。当我把这个进程放在主线程中时,它没有问题。你能给我一些建议吗

    public partial class MainWindow : Window
    {
       private void Window_Loaded(object sender, RoutedEventArgs e)
       {
            var server = new HttpServer();
            try
            {
                server.EndPoint = new IPEndPoint(127.0.0.0, 80); //set webServer para
                server.Start(); //start webServer
                server.RequestReceived += server_RequestReceived; //register the event
            }
            catch (Exception ex)
            {
                return;
            }
       }
       private void server_RequestReceived(object sender, HttpRequestEventArgs e)
       {
           var dataProcess = new Action<HttpRequestEventArgs>(DataProcess);
           Dispatcher.BeginInvoke(dataProcess,e); //start thread
       }
       private void DataProcess(HttpRequestEventArgs e)
       {
           StreamReader sr = new StreamReader(@"c:\test.txt");
           string text = sr.ReadToEnd();
           using (var writer = new StreamWriter(e.Response.OutputStream)) //**Cannot write stream**
           {
               writer.Write(text);
           }
           sr.Close();
       }
    }
公共部分类主窗口:窗口
{
已加载私有无效窗口(对象发送器、路由目标)
{
var server=newhttpserver();
尝试
{
server.EndPoint=new-IPEndPoint(127.0.0.0,80);//设置webServer参数
server.Start();//启动Web服务器
server.RequestReceived+=server\u RequestReceived;//注册事件
}
捕获(例外情况除外)
{
返回;
}
}
已接收私有void服务器\u RequestReceived(对象发送方,HttpRequestEventArgs e)
{
var dataProcess=新操作(dataProcess);
Dispatcher.BeginInvoke(dataProcess,e);//启动线程
}
私有void数据处理(HttpRequestEventArgs e)
{
StreamReader sr=新的StreamReader(@“c:\test.txt”);
string text=sr.ReadToEnd();
使用(var writer=newstreamwriter(e.Response.OutputStream))/**无法写入流**
{
作者:写(文本);
}
高级关闭();
}
}

我认为在新线程运行之前,您的请求已经完成。您可以做的是在新线程中执行整个请求。比如:

public partial class MainWindow : Window
{
   private void Window_Loaded(object sender, RoutedEventArgs e)
   {
        var start = new Action<HttpRequestEventArgs>(Start);
        Dispatcher.start(start,e); //start thread
   }

   private void Start(HttpRequestEventArgs e)
   {
        var server = new HttpServer();
        server.EndPoint = new IPEndPoint(127.0.0.0, 80); //set webServer para
        server.Start(); //start webServe
        server.RequestReceived += server_RequestReceived; //register the event
   }

   private void server_RequestReceived(object sender, HttpRequestEventArgs e)
   {
       StreamReader sr = new StreamReader(@"c:\test.txt");
       string text = sr.ReadToEnd();
       using (var writer = new StreamWriter(e.Response.OutputStream)) //**Cannot write stream**
       {
           writer.Write(text);
       }
       sr.Close();
   }
}
公共部分类主窗口:窗口
{
已加载私有无效窗口(对象发送器、路由目标)
{
var start=新操作(启动);
Dispatcher.start(start,e);//启动线程
}
专用无效启动(HttpRequestEventArgs e)
{
var server=newhttpserver();
server.EndPoint=new-IPEndPoint(127.0.0.0,80);//设置webServer参数
server.Start();//启动webServe
server.RequestReceived+=server\u RequestReceived;//注册事件
}
已接收私有void服务器\u RequestReceived(对象发送方,HttpRequestEventArgs e)
{
StreamReader sr=新的StreamReader(@“c:\test.txt”);
string text=sr.ReadToEnd();
使用(var writer=newstreamwriter(e.Response.OutputStream))/**无法写入流**
{
作者:写(文本);
}
高级关闭();
}
}

我认为在新线程运行之前,您的请求已经完成。您可以做的是在新线程中执行整个请求。比如:

public partial class MainWindow : Window
{
   private void Window_Loaded(object sender, RoutedEventArgs e)
   {
        var start = new Action<HttpRequestEventArgs>(Start);
        Dispatcher.start(start,e); //start thread
   }

   private void Start(HttpRequestEventArgs e)
   {
        var server = new HttpServer();
        server.EndPoint = new IPEndPoint(127.0.0.0, 80); //set webServer para
        server.Start(); //start webServe
        server.RequestReceived += server_RequestReceived; //register the event
   }

   private void server_RequestReceived(object sender, HttpRequestEventArgs e)
   {
       StreamReader sr = new StreamReader(@"c:\test.txt");
       string text = sr.ReadToEnd();
       using (var writer = new StreamWriter(e.Response.OutputStream)) //**Cannot write stream**
       {
           writer.Write(text);
       }
       sr.Close();
   }
}
公共部分类主窗口:窗口
{
已加载私有无效窗口(对象发送器、路由目标)
{
var start=新操作(启动);
Dispatcher.start(start,e);//启动线程
}
专用无效启动(HttpRequestEventArgs e)
{
var server=newhttpserver();
server.EndPoint=new-IPEndPoint(127.0.0.0,80);//设置webServer参数
server.Start();//启动webServe
server.RequestReceived+=server\u RequestReceived;//注册事件
}
已接收私有void服务器\u RequestReceived(对象发送方,HttpRequestEventArgs e)
{
StreamReader sr=新的StreamReader(@“c:\test.txt”);
string text=sr.ReadToEnd();
使用(var writer=newstreamwriter(e.Response.OutputStream))/**无法写入流**
{
作者:写(文本);
}
高级关闭();
}
}

最有可能是
e.Response.OutputStream
是只写的流,其中包含从服务器接收的响应

根据您想要做什么,您可以写入请求流,也可以从OutputStream读取


注意:您正在使用一些自定义类,因此建议完全基于方法名称。

最有可能是
e.Response。OutputStream
是只写流,其中包含从服务器接收的响应

根据您想要做什么,您可以写入请求流,也可以从OutputStream读取


注意:您正在使用一些自定义类,因此建议完全基于方法名称。

为什么不能编写流?有例外吗?如果是这样的话,信息是什么?如果不是的话,会发生什么意外行为?很可能
e.Response.OutputStream
超出范围并被处理。@phoog:消息是“无法访问封闭流”。@EbenRoux:我想是的,但我不知道如何处理它。你为什么不能编写流?有例外吗?如果是这样的话,信息是什么?如果不是的话,会发生什么意外行为?很可能
e.Response.OutputStream
超出范围并被处理。@phoog:消息是“无法访问封闭流”。@EbenRoux:我想是的,但我不知道如何处理它。