ネットワーク上でasync/awaitを使うのが有益だと読んだので、ファイルを空白のブロブにアップロードするのにそれを適用したいと思います。Task.Wait()は私のアプリケーションをデッドロックします
この方法で.Wait()
を使用すると、アプリケーションはawait _Container.CreateIfNotExistsAsync();
で停止します。 InitializeCategories(context)
メソッドは、ブロブがループする前にアップロードするのを待つ必要があるため、.Wait()
を使用します。
私はマルチスレッドを使うのが全く新しいです、なぜこれが起こっているのか説明して、それを修正する方法を教えてもらえますか?
protected override void Seed(ApplicationDbContext context)
{
base.Seed(context);
InitializeImages().Wait();
InitializeCategories(context);
}
public static async Task InitializeImages()
{
_PlaceHolderImage = "placeholder-categories.jpg";
_StorageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
_BlobClient = _StorageAccount.CreateCloudBlobClient();
_Container = _BlobClient.GetContainerReference("images");
await _Container.CreateIfNotExistsAsync();
//To view the blob in the browser
await _Container.SetPermissionsAsync(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });
CloudBlockBlob blockBlob = _Container.GetBlockBlobReference(_PlaceHolderImage);
await blockBlob.UploadFromFileAsync(HttpContext.Current.Server.MapPath("~/Content/Images/" + _PlaceHolderImage), FileMode.Open);
}
public static void InitializeCategories(ApplicationDbContext db)
{
// Loop over items within the container and output the length and URI.
foreach (IListBlobItem item in _Container.ListBlobs())
{
if (item.GetType() == typeof(CloudBlockBlob))
{
CloudBlockBlob blob = (CloudBlockBlob)item;
Console.WriteLine("Block blob of length {0}: {1}", blob.Properties.Length, blob.Uri);
}
}
}
保護オーバーライドvoidシード(ApplicationDbContextコンテキスト)の署名を保護オーバーライド非同期タスクシード(ApplicationDbContext)に変更することはできますか?その後、InitializeImages()を待ち、Wait()呼び出しを取り除くことができます。 –
@Jeroen私がそれを変更した場合、署名は一致しません。ベースメソッドは外部ライブラリにありますので、変更することはできません。 –
この行を 'await_Container.CreateIfNotExistsAsync();'に変更してみてください '_Actit _Container.CreateIfNotExistsAsync()。ConfigureAwait(false);' –