2016-05-11 15 views
2

Я попытался скопировать в MemoryStream, как показано ниже, но без успехаRequest.Files [0] .InputStream расположен, если положить его в волоске

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

Форвард Я получаю это сообщение:

необработанное исключение типа 'System.ObjectDisposedException' произошло в mscorlib.dll

+0

Пожалуйста, прочитайте об использовании асинхронных методов в C#. Также при показе образца кода обязательно соблюдайте надлежащую практику в переменных имен (определенно 'm' не является хорошим описательным именем), располагая объекты с помощью' use' (см. [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() поток памяти когда вы закончите с ним, или оберните его в операторе using

1

Во-первых, вы используете метод async, поэтому вам нужно его ждать;

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

Или просто используйте CopyTo(). Если вы не дожидаетесь в строке 02, работа не будет завершена по строке 03.

Во-вторых, поскольку входной поток принадлежит запросу, я бы поспорил, что после завершения веб-запроса все он очищается, и ваш поток пытается скопировать содержимое запроса слишком поздно.

Можете ли вы просто переместить строки 01 и 02 в основной поток запроса? Что-то больше похоже;

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

Вы получаете идею - загрузить поток запроса в поток памяти перед тем Метод Действие заканчивается.

 Смежные вопросы

  • Нет связанных вопросов^_^