Опыт: Многолетний опыт с. 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 установлен.