. NET web Asyn c звонки на пакет Azure .Storage.Blobs зависают - PullRequest
0 голосов
/ 12 марта 2020

Опыт: Многолетний опыт с. Net и VB (C#). Не так долго с Azure, Asyn c / Await и Multi threading.

Краткое описание проблемы: Я написал рабочий стол (на основе форм), подтверждение концепции для загрузки / список и получить видео из Azure Block Store. Первоначально это было с Syn c вызовами, но позже я добавил к Po C, чтобы использовать вызовы Asyn c. Все было хорошо, и я получил то, что я считаю "ожидаемым поведением". Версия Asyn c позволила мне заполнить ярлык надписью «Загрузка», а затем очистить этот ярлык после завершения загрузки. В конечном решении это позволит полностью загружать веб-страницу независимо от времени, необходимого для загрузки видеоматериала. Проблемы возникли, когда я начал перемещать код Po C в приложение. NET web . В этом проекте идентичный код зависает в точке, где второй метод Asyn c называется [Await download.Content.CopyToAsyn c (downloadFileStream)]. Под этим я подразумеваю, что он никогда не попадет в закомментированную точку выполнения: C.

Imports System.IO
Imports Azure.Storage.Blobs
Imports Azure.Storage.Blobs.Models
Imports System.Threading.Tasks
Public Class frmBlockStore
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/concepts/async/
        ' https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-dotnet
    End Sub
    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim gWorkingPath As String = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath
        Dim sAzFRConnection As String = Environment.GetEnvironmentVariable("AZ_FR_BLOCK_STORAGE_CONNECTION_STRING")
        If sAzFRConnection <> "" Then
            Dim blobServiceClient As BlobServiceClient = New BlobServiceClient(sAzFRConnection)
            ' Open an existing container
            Dim sFileName As String = "17.5.04.mp4"
            Dim containerClient As BlobContainerClient = blobServiceClient.GetBlobContainerClient("media")
            If containerClient.Exists Then
                ' Sync calls that work perfectly...
                'Dim blobClient As BlobClient = containerClient.GetBlobClient(sFileName.ToLower)
                'Dim download As BlobDownloadInfo = blobClient.Download()
                'Dim downloadFileStream As FileStream = File.OpenWrite(gWorkingPath & "DocFiltered_files" & "\" & sFileName)
                'download.Content.CopyTo(downloadFileStream)
                'downloadFileStream.Close()
                Dim lReturn As Task = DownloadVideoAsync(containerClient, sFileName)
                ' Execution point: A
            End If
        End If
    End Sub
    Async Function DownloadVideoAsync(containerClient As BlobContainerClient, sFileName As String) As Task(Of Long)
        Dim gWorkingPath As String = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath
        Dim downloadFileStream As FileStream = File.OpenWrite(gWorkingPath & "DocFiltered_files" & "\" & sFileName)
        Dim blobClient As BlobClient = containerClient.GetBlobClient(sFileName)
        Dim download As BlobDownloadInfo = Await blobClient.DownloadAsync()
        ' Execution point: B
        Await download.Content.CopyToAsync(downloadFileStream)
        ' Execution point: C
        Dim lLth As Long = downloadFileStream.Length
        downloadFileStream.Close()
        Return lLth
    End Function
End Class

При нажатии на кнопку обязательный код выполняется нормально и переходит к вызову DownloadVideoAsyn c. Я включил рабочий эквивалент кода syn c, закомментированный, в событие нажатия кнопки для тех, кто заинтересован. Внутри этой функции выполнение переходит к «Await blobClient.DownloadAsyn c ()». Эта функция никогда не занимает много времени, так как я думаю, что она настраивает загрузку, а не делает это. Я предполагаю, что есть некоторые побочные эффекты Azure, таким образом Asyn c природа вызова. Таким образом, после выполнения этого оператора следующая точка выполнения находится в точке выполнения: то есть обратно в вызывающую процедуру. Это ожидается. После этого он возобновляется в точке выполнения: B. Это все, как отладчик рисует его (принимая, что многопоточный характер происходящего может означать, что это на самом деле параллельно?) Следующий оператор [Await download.Content.CopyToAsyn c (downloadFileStream)] начинает выполняться. В папке назначения целевого файла мы видим, что теперь существует файл нулевого байта с указанным именем файла. Тем не менее, точка выполнения: C никогда не достигается, и файл в целевом месте назначения никогда не достигает больше нуля.

Практически идентичный вызов syn c в настольном приложении работает отлично, как показано ниже.

   Dim lReturn As Task(Of Long) = DownloadVideoAsync(containerClient, "17.5.04.mp4")

   Async Function DownloadVideoAsync(containerClient As BlobContainerClient, sFileName As String) As Task(Of Long)
        Dim gWorkingPath As String = "C:\Work\Source\Web\FindResponse\WebSource\"
        Dim downloadFileStream As FileStream = File.OpenWrite(gWorkingPath & "DocFiltered_files" & "\" & sFileName)

        Dim blobClient As BlobClient = containerClient.GetBlobClient(sFileName)
        Dim download As BlobDownloadInfo = Await blobClient.DownloadAsync()
        Await download.Content.CopyToAsync(downloadFileStream)

        Dim lLth As Long = downloadFileStream.Length
        downloadFileStream.Close()
        Return lLth
    End Function

Возможно, мне следует добавить, что настройка веб-проекта, который на самом деле удалось собрать без ошибок и предупреждений, была «сложной» и отнимала много времени. Я бы порекомендовал всем, кто пытается использовать инструменты Azure, чтобы использовать последнюю версию. NET, загрузить dev-версию. NET Cord SDK и использовать NuGet вместо «do tnet add», установить необходимые пакеты. Если ваше приложение устарело, делайте резервные копии исходного кода на каждом этапе, чтобы вы могли откатиться и пересмотреть свои варианты!

Сведения об окружении: Оба приложения (для настольных компьютеров и в Интернете) работают в среда разработки Visual Studio и подключаются к Azure с использованием строки подключения.

Windows 10 home, версия 1903, сборка ОС 18362.719

Visual studio: версия Microsoft Visual Studio Community 2017 15.9.13 VisualStudio.15.Release / 15.9.13 + 28307.718 Microsoft. NET Framework Version 4.8.03752

Установленная версия: Community

Visual C ++ 2017 00369-60000-00001-AA335 Microsoft Visual C ++ 2017

Инструменты Application Insights для пакета Visual Studio 8.14.20131.1 Инструменты Application Insights для Visual Studio

ASP. NET AJAX Control Toolkit 1.0 ASP. NET AJAX Control Toolkit Интеграционный пакет Visual Studio

ASP. NET и веб-инструменты 2017 15.9.04012.0 ASP. NET и веб-инструменты 2017

ASP. NET Языковые службы Core Razor 15.8.31590 Предоставляет языковые услуги для ASP. NET Core Razor.

ASP. NET Веб-фреймворки и инструменты 2017 5.2.61435.0 Для получения дополнительной информации посетите веб-сайт https://www.asp.net/

Azure App Service Tools v3.0.0 15.9.03024.0 Azure Сервисные инструменты приложения v3.0.0

Azure Функции и инструменты веб-заданий 15.9.03024.0 Azure Инструменты функций и веб-заданий

C# Инструменты 2.10.0-бета2- 63501-03 + компоненты b9fb1610c87cccc8ceb74a770dba261a58e39c4a C#, используемые в IDE. В зависимости от типа вашего проекта и настроек может использоваться другая версия компилятора.

Common Azure Tools 1.10 Предоставляет общие службы для использования Azure Mobile Services и Microsoft Azure Tools.

JavaScript Языковая служба 2.0 JavaScript Языковая служба

JavaScript Система проектов 2.0 JavaScript Система проектов

JavaScript Система проектов UWP 2.0 JavaScript Проект UWP Система

Microsoft Azure Инструменты 2.9 Microsoft Azure Инструменты для Microsoft Visual Studio 2017 - v2.9.20417.1

Инструменты непрерывной доставки Microsoft для Visual Studio 0.4 Упрощение конфигурации Azure Конвейеры DevOps из среды IDE Visual Studio.

Microsoft JVM Debugger 1.0 Обеспечивает поддержку подключения отладчика Visual Studio к JDWP-совместимым Java Виртуальным машинам

Microsoft Library Manager 1.0 Установка библиотек на стороне клиента легко для любого веб-проекта

Microsoft MI-Based Debugger 1.0 Предоставляет поддержку для подключения Vis Отладчики, совместимые с Studio и MI

Мастера Microsoft Visual C ++ 1.0 Мастера Microsoft Visual C ++

Инструменты Microsoft Visual Studio для контейнеров 1.1 Разрабатывайте, запускайте, проверяйте свои ASP. NET Основные приложения в целевая среда. F5 ваше приложение напрямую в контейнер с отладкой или CTRL + F5 для редактирования и обновления sh вашего приложения без необходимости перестраивать контейнер.

Microsoft Visual Studio V C Пакет 1.0 Microsoft Visual Studio V C Пакет

Расширение пакета MLGen 1.0 Пакет MLGen Расширение Visual Studio Подробная информация

MySQL для Visual Studio 1.2.8 Инструменты проектирования и управления данными для MySQL. Авторское право (c) 2007, 2018, Oracle и / или его филиалов. Все права защищены.

Диспетчер пакетов NuGet 4.6.0 Диспетчер пакетов NuGet в Visual Studio. Для получения дополнительной информации о NuGet посетите http://docs.nuget.org/.

Инструменты разработчика Office для Visual Studio 2017 ENU 15.0.28224.00 Инструменты разработчика Microsoft Office для Visual Studio 2017 ENU

ProjectServicesPackage Расширение 1.0 ProjectServicesPackage Расширение Visual Studio Подробная информация

ResourcePackage Расширение 1.0 Расширение ResourcePackage Visual Studio Подробная информация

Расширение ResourcePackage 1.0 Расширение ResourcePackage Visual Studio Подробная информация

SQL Инструменты данных сервера 15.1.61906.03120 Microsoft SQL Инструменты данных сервера

Инструменты TypeScript 15.9.30524.2002 Инструменты TypeScript для Microsoft Visual Studio

Visual Basi c Инструменты 2.10.0-beta2-63501-03 + b9fb1610c87cccc8ceb74a770dba261a58e39ca Visual Basi c компоненты, используемые в IDE. В зависимости от типа вашего проекта и настроек может использоваться другая версия компилятора.

Инструменты Visual F # 10.2 для F # 4.5 15.8.0.0. Commit Ha sh: 6e26c5bacc8c4201e962f5bdde0a177f82f88691. Инструменты Microsoft Visual F # 10.2 для F # 4.5

Хост-пакет адаптера отладки кода Visual Studio 1.0 Уровень взаимодействия для размещения адаптеров отладки кода Visual Studio в Visual Studio

Инструменты Visual Studio для контейнеров 1.0 Инструменты Visual Studio для Контейнеры

Инструменты Visual Studio для универсальных Windows приложений 15.0.28307.718 Приложения Visual Studio Tools для универсальных Windows позволяют создать единое универсальное приложение, которое может работать с любым устройством, работающим Windows 10: телефон , планшет, P C и многое другое. Включает в себя Microsoft Windows 10 Software Development Kit.

Workflow Manager Tools 1.0 1.0 Этот пакет содержит необходимые компоненты интеграции Visual Studio для Workflow Manager.

NuGet:

PM> get-package

Идентификаторы версий ProjectName
- -------- -----------
Azure .Core {1.1.0} BlobStore
Azure .Storage.Blobs {12.4. 0} BlobStore
Azure .Storage.Common {12.3.0} BlobStore
Microsoft.Bcl.AsyncInterfaces {1.0.0} BlobStore
Microsoft.CodeDom.Providers.DotN ... {2.0.1 } BlobStore
System.Buffers {4.5.0} BlobStore
System.Diagnostics.DiagnosticSource {4.6.0} BlobStore
System.Memory {4.5.3} BlobStore
System.Numerics.Vectors {4.5 .0} BlobStore
System.Runtime.CompilerServices .... {4.5.2} BlobStore
System.Threading.Tasks.Extensions {4.5.2} BlobStore

. NET Core SDK 3.1 установлен.

1 Ответ

1 голос
/ 12 марта 2020

Похоже, вы создаете новый проект ASP. NET Web Forms. Если вы начинаете новый проект, я рекомендую вместо него использовать ASP. NET Core.

При этом использовать асинхронный код на ASP. NET веб-формах * 1004. *, вам нужно:

  1. Установить Page.Async на true.
  2. Либо передать Task (lReturn в вашем примере) на RegisterAsyncTask (после вы оборачиваете его PageAsyncTask) или await и делаете обработчик событий Async Sub.
...