В чем разница между DownloadText () и DownloadTextAsync ()? - PullRequest
0 голосов
/ 30 мая 2019

В моем коде я получаю ссылку на BLOB-объект в контейнере, и я вызываю 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() в качестве потенциальное исправление.

1 Ответ

2 голосов
/ 30 мая 2019

В основном проекте .net, если вы используете WindowsAzure.Storage пакет 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 минут (после завершения загрузки), а затем распечатано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...