C# - Проблема чтения потока файловой памяти в моем проекте MVC - PullRequest
0 голосов
/ 31 января 2020

Поскольку мой код показан ниже, загруженный файл изображения иногда читается пустым (fileContents устанавливается в 0) или читается наполовину. Как я уже проверял, я мог видеть, что fileContents получает правильное значение, когда я медленно переключаюсь с myViewModel.File.CopyToAsync(memoryStream); на myViewModel.Image =... в режиме отладки. Поэтому я считаю, что есть проблема с копией потока памяти, но я не понимаю, почему.

Однако, когда я засыпаю поток, удаляя закомментированный System.Threading.Thread.Sleep(1000);, тогда чтение изображения выполняется правильно, а fileContents получить правильное значение. Может ли проблема быть вызвана декларацией using (var memoryStream = new MemoryStream())? В чем заключается проблема, и есть ли лучший способ исправить эту проблему, а не спать поток?

  if (myViewModel.File != null)
        {
            byte[] fileContents;
            using (var memoryStream = new MemoryStream())
            {
                myViewModel.File.CopyToAsync(memoryStream);
                //System.Threading.Thread.Sleep(1000);
                fileContents = memoryStream.ToArray();
                myViewModel.Image = new MyImage{ FileName = myViewModel.File.FileName, File = myViewModel.File, ContentType = myViewModel.File.ContentType, FileData = fileContents };
            }
        }

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Проблема в том, что вы вызываете асинхронный метод, не ожидая его.

myViewModel.File.CopyToAsync(memoryStream);

Можете ли вы переписать свой метод как async и использовать слово await?

Затем вы можете ожидать метод CopyToAsyn c.

await myViewModel.File.CopyToAsync(memoryStream);

1 голос
/ 31 января 2020

Вы не ждете для завершения myViewModel.File.CopyToAsyn c (memoryStream).

Либо используйте

await myViewModel.File.CopyToAsync(memoryStream);

, либо не используйте asyn c вообще:

myViewModel.File.CopyTo(memoryStream);
...