В чем разница между DownloadText() и DownloadTextAsync()?

В моем коде я получаю ссылку на большой двоичный объект в контейнере и вызываю для него метод DownloadText(), но получаю сообщение об ошибке no accessible extension method 'DownloadText' accepting a first argument of type 'CloudBlockBlob' could be found

В качестве одного из возможных исправлений Visual Studio предлагает мне использовать метод DownloadTextAsync(). В чем разница между двумя методами?

Я получаю свою учетную запись хранения с помощью new CloudStorageAccount, а затем получаю BlobClient с помощью storageAccount.CreateCloudBlobClient(). Затем получаю ссылку на контейнер, используя GetContainerReference() на клиенте, и на BlockBlob, используя GetBlockBlobReference() в ссылке на контейнер, затем я вызываю blockBlob.DownloadText(), который показывает мне ошибку 'CloudBlockBlob' does not contain a definition for 'DownloadText' and no accessible extension method 'DownloadText' accepting a first argument of type 'CloudBlockBlob' could be found (are you missing a using directive or an assembly reference?) и показывает, как использовать DownloadTextAsync() в качестве потенциального исправления.

Один использует паттерн async/await (вам придется подождать), другой — нет.

DiplomacyNotWar 30.05.2019 06:48

Оба они возвращают содержимое BLOB-объекта в виде строки?

kartikeykant18 30.05.2019 06:49

Ну, я ожидаю, что DownloadTextAsync вернет Task<string>, который вы получите string, когда вы await его.

DiplomacyNotWar 30.05.2019 06:51

Да, они делают (вроде), но ваша проблема не имеет ничего общего с суффиксом Async или нет, и поэтому здесь недостаточно информации, чтобы удовлетворительно ответить на ваш вопрос, пожалуйста, вставьте свой фактический код или любую другую соответствующую информацию

TheGeneral 30.05.2019 06:51

@TheGeneral отредактировал, чтобы рассказать, что я делаю.

kartikeykant18 30.05.2019 07:00

Скорее всего, вы используете версию Storage SDK для .Net Core. Обратите внимание, что версия SDK для .Net Core не имеет методов синхронизации. У него есть только асинхронные методы.

Gaurav Mantri 30.05.2019 07:21

Как я могу использовать методы синхронизации? Или лучше использовать downloadasync?

kartikeykant18 30.05.2019 07:26

@kartikeykant18, если вы хотите использовать метод синхронизации DownloadText() в ядре .net, вы можете использовать новый пакет nuget для хранилища Azure Microsoft.Azure.Storage.Blob.

Ivan Yang 30.05.2019 07:44

@kartikeykant18, если ответ поможет, отметьте его как ответ. Спасибо.

Ivan Yang 04.06.2019 07:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
1 062
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В основном проекте .net, если вы используете пакет WindowsAzure.Хранилище nuget, есть только асинхронный метод, такой как DownloadTextAsync, и нет метода синхронизации, такого как DownloadText.

Но новый пакет Microsoft.Azure.Storage.Blob поддерживает синхронизацию и асинхронный метод, такие как DownloadTextAsync и DownloadText.

Выбор метода синхронизации или асинхронности зависит от вас.

Если файл очень большой, и его загрузка займет много времени, а во время загрузки у вас есть другие дела, вы можете выбрать асинхронный метод.

Пример асинхронного кода, как показано ниже:

class Program
{
    static void Main(string[] args)
    {
        //your other code
        CloudBlockBlob myblob = cloudBlobContainer.GetBlockBlobReference("mytemp.txt");

        Console.WriteLine("in main thread: start download 111");

        //assume the download would take 10 minutes. 
        Task<string> s = myblob.DownloadTextAsync();            

        //The message will print out immediately even if the download is in progress.
        Console.WriteLine("in main thread 222!");

        //use this code to check if the download complete or not
        while (!s.IsCompleted)
        {
            Console.WriteLine("not completed");
            System.Threading.Thread.Sleep(2000);
        }

        Console.WriteLine("the string length in MB: "+s.Result.Length/1024/1024);

        Console.ReadLine();
    }    


}

Запустив приведенный выше код, вы увидите, что сообщение in main thread 222! распечатывается немедленно, даже если идет загрузка. И это означает, что вы можете делать другие вещи (какие-то другие операции), когда идет загрузка. Они не блокируют друг друга.

И если вы используете метод синхронизации, например код ниже:

        static void Main(string[] args)
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse("xxxx");

            var blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer cloudBlobContainer = blobClient.GetContainerReference("f22");
            CloudBlockBlob myblob = cloudBlobContainer.GetBlockBlobReference("mytemp.txt");

            Console.WriteLine("in main thread: start download 111");

            string s = myblob.DownloadText();            

            //if the download takes 10 minutes, then the following message will be printed out after 10 minutes.
            Console.WriteLine("in main thread 222!");  

            Console.ReadLine();
        }

если файл большой и загрузка займет 10 минут. При запуске кода сообщение in main thread 222! будет заблокировано на 10 минут (после завершения загрузки), а затем распечатано.

Другие вопросы по теме