Backgroundworker阻止Pageload

don*_*_me -1 c# multithreading task backgroundworker async-await

我正在尝试从Entity Framework加载大量数据.请求大约需要一分钟,并阻止页面加载.由于这对于较大的查询变得不合理,我想我会尝试使用后台线程或类似的东西.经过一段时间的研究,我找到了一种名为BackgroundWorker的东西.我试图实现这个但它不起作用.这是我的代码:

  void Page_LoadComplete(object sender, EventArgs e)
    {
        InitializeBackgroundWorker();
    }

    private void InitializeBackgroundWorker()
    {
        bw = new BackgroundWorker {WorkerReportsProgress = true};


        bw.DoWork += (sender, e) => e.Result = (List<object>)e.Argument;
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
        bw.RunWorkerAsync(doSomething());

        bw.RunWorkerCompleted += (sender, e) =>
        {
            AjaxWaitBox.Text = "Completed";
        };
    }
        private readonly Func<List<object>> doSomething = () =>
    {

        var list = ObjectFactory.Container.GetInstance<IActivityRepository>().GetAllActivitiesNotFiltered(ContentReference.RootPage);
        var count = list.Count;
        int i = 0;
        foreach (var item in list)
        {
            i++;
            Console.WriteLine("-(DoWork)->" + i);
            double percentage = (Convert.ToDouble(i) / Convert.ToDouble(count)) * 100;
            Console.WriteLine("-(DoWork.percentage)-> " + percentage);
            bw.ReportProgress((int)percentage);
        }
        return list;
    };
    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        AjaxWaitBox.Text = e.ProgressPercentage.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

起初我在OnInit方法中调用了InitializeBackgroundWorker().然后页面加载大约一分钟,然后我的文本框的值,用于显示查询的进度,是:"已完成".然后我将调用移到了Page_LoadComplete,但结果仍然相同.我在这里错过了什么?我是否还需要包含async/await运算符或什么?

Ste*_*ary 5

BackgroundWorker仅对释放UI线程有用.由于您使用的是ASP.NET,因此您没有UI线程.

ASP.NET使用HTTP请求和响应.(不幸的是)"页面"抽象看起来像一个UI框架,但事实并非如此.

因此,您需要根据HTTP请求和响应来考虑您的问题,因为这是实际发生的事情.每个请求只有一个响应,因此无法"发送无数据页面响应",然后更改为"发送带有数据响应的页面".

相反,你要做的是发送一个没有数据的页面响应然后让那个页面使用像AJAX(或UpdatePanel)这样的技术来发出一个单独的实际数据请求并用它填充页面.