2016-05-11 47 views
2

我試圖複製到一個MemoryStream,像下面.InputStream配置,但沒有成功Request.Files [0]時,把他一個線程內

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

正向我收到這樣的信息:

型 'System.ObjectDisposedException' 未處理的異常出現在mscorlib.dll

+0

請閱讀有關在C#中使用異步方法。另外,在顯示示例代碼時,務必遵守命名變量(絕對不是好的描述性名稱)的良好做法,使用'using'處理對象(參見[MCVE]以獲取更多指導)。 –

回答

1

您需要await異步方法,否則在請求完成後可能會執行完成。

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

注意:你需要做的所有方法達到原來的動作/頁異步過。

0

你需要等待運行CopyToAsync任務,否則將被運行,而你正在訪問它填充

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

而且對象,請注意您需要.Dispose()內存流當你完成它,或包裝在使用聲明

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(); 
} 

你的想法 -操作方法完成之前加載請求流進內存流

相關問題