gpt4 book ai didi

c# - 在 ASP.NET Web 应用程序中将异步/等待与任务一起使用时,UI 线程被阻塞

转载 作者:行者123 更新时间:2023-11-30 16:02:25 24 4
gpt4 key购买 nike

我需要从后台代码异步运行 SSIS 包,这样它就不会阻塞 UI 线程。目前我正在使用创建一个简单的线程来处理这个问题而不阻塞 UI 线程。然而,在阅读了一些博客文章后,我想尝试使用 async/await 功能,因为与 async/await 相比,创建新线程是资源密集型的。

我写的代码是这样的。

        protected void Page_Load(object sender, EventArgs e)
{
RegisterAsyncTask(new PageAsyncTask(SSISAsync));
}

public async void Button1_Click(object sender, EventArgs e)
{
Debug.WriteLine("Before calling task");
await SSISAsync();
Debug.WriteLine("After calling task");
}


public Task<int> SSISAsync()
{
//Sample task to keep the task doing some work.
return Task.Run(() =>
{
for (int i = 0; i < 100000; i++)
{
for (int j = 0; j < 10000; j++)
{
int k = i * j;
//Nothing LOL
}
}
Debug.WriteLine("from thread");
return 1;
});
}

我期望发生的事情是,当 Button1_Click 方法将同步执行直到遇到 await 关键字,然后调用 SSISAsync 在与线程池不同的线程上,而不是在 UI 线程上。因此,理想情况下,这不会在执行任务时阻塞 UI 线程。但是我的 UI 阻塞了,即)IE 中选项卡上的加载 gif 一直持续到任务完成。

我在SO里看到过几个类似的问题。但其中大部分都与 WPF 有关,而且没有一个解决方案真正奏效。

最佳答案

这里有一些误解。

So, ideally this not be blocking the UI thread when the Task is being executed.

首先,在 ASP.NET 上没有 UI 线程这样的东西。

But my UI is blocking i.e) The loading gif on the tab in IE keeps on going until the Task is completed.

您真正需要的是一种从 ASP.NET 请求中提前返回的方法。正如我在我的博客上描述的那样,async has nothing to do with returning early .

事实上,由于您是将其加载到浏览器中,所以我认为提前返回根本行不通。您真正想要做的是返回一个页面,然后使用 AJAX 加载它需要的任何其他内容。 AJAX 自然是异步的(在客户端),因此这种方法应该允许您快速加载“正在加载...”页面,然后在加载其余部分时保持 UI(浏览器)响应。

关于c# - 在 ASP.NET Web 应用程序中将异步/等待与任务一起使用时,UI 线程被阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657881/

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