使用async / await与ASP.NET Web应用程序中的任务

时间:2016-06-06 12:46:30

标签: c# asp.net multithreading async-await task

我需要从异步后面的代码运行一个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有关,而且没有一个解决方案能够真正解决。

1 个答案:

答案 0 :(得分:3)

这里有一些误解。

  

因此,理想情况下,当执行任务时,这不会阻塞UI线程。

首先,ASP.NET上没有UI线程。

  

但是我的UI正在阻止,即IE中选项卡上的加载gif一直持续到任务完成。

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

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