我需要从异步后面的代码运行一个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线程上。所以,理想情况下,当执行Task时,这不会阻塞UI线程。
但是我的UI正在阻塞,即IE中选项卡上的加载gif一直持续到任务完成为止。
我在SO中看到了一些类似的问题。但是他们中的大多数都与WPF有关,而且没有一个解决方案能够真正解决。
答案 0 :(得分:3)
这里有一些误解。
因此,理想情况下,当执行任务时,这不会阻塞UI线程。
首先,ASP.NET上没有UI线程。
但是我的UI正在阻止,即IE中选项卡上的加载gif一直持续到任务完成。
您真正想要的是一种从ASP.NET请求提前返回的方法。正如我在博客中描述的那样async
has nothing to do with returning early。
事实上,由于你将它加载到浏览器中,我认为早期返回根本不会起作用。您真正想要做的是返回一个页面,然后使用AJAX加载其他任何需要的页面。 AJAX自然是异步的(在客户端),因此这种方法应该允许您快速加载“加载...”页面,然后在加载其余部分时保持UI(浏览器)的响应。