gpt4 book ai didi

c# - Task.Wait() 使我的应用程序死锁

转载 作者:行者123 更新时间:2023-12-03 05:07:48 25 4
gpt4 key购买 nike

我了解到在网络上使用 async/await 很有好处,因此我想将其应用于将文件上传到 azure blob。

当我在该方法上使用 .Wait() 时,应用程序会在 await _Container.CreateIfNotExistsAsync(); 上停止。我想使用 .Wait() 因为 InitializeCategories(context) 方法需要等待 blob 上传后才能循环访问它们。

我对使用多线程完全陌生,有人可以解释为什么会发生这种情况并告诉我如何解决它吗?

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);
}
}
}

最佳答案

I have read that it is beneficial to use async/await on networking

是的,但是为什么

答案是:async 是有益的(特别是对于基于 I/O 的代码),这样您就可以释放线程来执行其他操作。在 ASP.NET 应用程序中,这意味着您有更多线程可用于处理传入请求。哦,等等...

protected override void Seed(ApplicationDbContext context)

当您的应用程序处理其第一个请求(并对数据库进行播种)时,释放线程没有任何意义,因为无论如何,在数据库播种之前它们都无法执行任何操作。

因此在这种情况下,您应该同步上传。

can someone explain why this is happening

我有一个blog post更详细的内容,但总结一下:

  • await 默认情况下将捕获“上下文”,并将在该上下文中恢复执行 async 方法。
  • ASP.NET(当前)有一个请求上下文,用于处理 HttpContext.Current、当前页面区域性等内容。
  • ASP.NET 上下文一次只允许一个线程进入。

因此,当您在请求上下文中阻塞线程 (Wait) 时,async 方法无法完成,因为它正在等待该请求上下文空闲。当然,Wait 正在等待 async 方法完成,因此最终会出现死锁。

关于c# - Task.Wait() 使我的应用程序死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36186532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com