В моем коде я получаю ссылку на большой двоичный объект в контейнере и вызываю для него метод 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()
в качестве потенциального исправления.
Оба они возвращают содержимое BLOB-объекта в виде строки?
Ну, я ожидаю, что DownloadTextAsync
вернет Task<string>
, который вы получите string
, когда вы await
его.
Да, они делают (вроде), но ваша проблема не имеет ничего общего с суффиксом Async или нет, и поэтому здесь недостаточно информации, чтобы удовлетворительно ответить на ваш вопрос, пожалуйста, вставьте свой фактический код или любую другую соответствующую информацию
@TheGeneral отредактировал, чтобы рассказать, что я делаю.
Скорее всего, вы используете версию Storage SDK для .Net Core. Обратите внимание, что версия SDK для .Net Core не имеет методов синхронизации. У него есть только асинхронные методы.
Как я могу использовать методы синхронизации? Или лучше использовать downloadasync?
@kartikeykant18, если вы хотите использовать метод синхронизации DownloadText() в ядре .net, вы можете использовать новый пакет nuget для хранилища Azure Microsoft.Azure.Storage.Blob.
@kartikeykant18, если ответ поможет, отметьте его как ответ. Спасибо.
В основном проекте .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 минут (после завершения загрузки), а затем распечатано.
Один использует паттерн async/await (вам придется подождать), другой — нет.