Request.Files [0] .InputStream在将他放入Thread时被释放

时间:2016-05-11 17:01:33

标签: c# inputstream objectdisposedexception

我尝试复制到MemoryStream,如下所示,但没有成功

MemoryStream m = new MemoryStream();
Request.Files[0].InputStream.CopyToAsync(m);
ToDo(NameOfFile, m);

转发我收到此消息:

  

未处理的类型' System.ObjectDisposedException'   发生在mscorlib.dll

3 个答案:

答案 0 :(得分:1)

您需要await异步方法,否则它可能在请求完成后完成执行。

using(var memoryStream = new MemoryStream())
{
  await Request.Files[0].InputStream.CopyToAsync(memoryStream);
  ToDo(NameOfFile, memoryStream);
}

注意:您还需要将所有方法设置为原始操作/页面异步。

答案 1 :(得分:1)

首先,您使用的是异步方法,因此您需要等待它;

01 MemoryStream m = new MemoryStream();
02 await Request.Files[0].InputStream.CopyToAsync(m);
03 ToDo(NameOfFile, m);

或者只使用CopyTo()代替。如果你没有在第02行等待,那么工作将不会在第03行完成。

其次,由于输入流属于请求,我敢打赌,一旦Web请求完成,关于它的所有内容都会被清除,并且您的线程正在尝试复制请求内容太晚。

您可以简单地将01和02行移动到请求的主线程中吗?更喜欢的东西;

 public Task<ActionResult> DoFileStuff() 
 {
    MemoryStream m = new MemoryStream();
    await Request.Files[0].InputStream.CopyToAsync(m);
    new Thread(DoMoreWork).Start();
 }

您明白了 - 在操作方法完成之前,将请求流加载到内存流中。

答案 2 :(得分:0)

您需要等待运行CopyToAsync的任务,否则它将在您访问正在填充的对象时运行

MemoryStream m = new MemoryStream();
await Request.Files[0].InputStream.CopyToAsync(m);
ToDo(NameOfFile, m);

另外,请注意,完成后需要.Dispose()内存流,或将其包装在using语句中