如何独立于数据加载UI

本文关键字:数据 加载 UI 于数据 独立 何独立 | 更新日期: 2023-09-27 18:01:01

我正在webserver中使用c#和数据库创建一个应用程序。从webserver访问数据时,速度非常慢,表单也会挂起,直到加载数据为止。有没有办法先加载表格,然后再加载数据?

如何独立于数据加载UI

解决此问题的常用方法是使用BackgroundWorker类。

public void InitBackgroundWorker()
{
    backgroundWorker.DoWork += YourLongRunningMethod;
    backgroundWorker.RunWorkerCompleted += UpdateTheWholeUi;
    backgroundWorker.WorkerSupportsCancellation = true; // optional
    // these are also optional
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.ProgressChanged += UpdateProgressBar;
}
// This could be in a button click, or simply on form load
if (!backgroundWorker.IsBusy)
{
    backgroundWorker.RunWorkerAsync(); // Start doing work on background thread
}
// ...
private void YourLongRunningMethod(object sender, DoWorkEventArgs e)
{
    var worker = sender as BackgroundWorker;
    if(worker != null)
    {
        // Do work here...
        // possibly in a loop (easier to do checks below if you do)
        // Optionally check (while doing work):
        if (worker.CancellationPending == true)
        {
            e.Cancel = true;
            break; // If you were in a loop, you could break out of it here...
        }
        else
        {
            // Optionally update
            worker.ReportProgress(somePercentageAsInt);
        }
        e.Result = resultFromCalculations; // Supports any object type...
    }
}
private void UpdateProgressBar(object sender, ProgressChangedEventArgs e)
{
    int percent = e.ProgressPercentage;
    // Todo: Update UI
}
private void UpdateTheWholeUi(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        // Todo: Update UI
    }
    else if (e.Error != null)
    {
        string errorMessage = e.Error.Message;
        // Todo: Update UI
    }
    else
    {
        object result = e.Result;
        // Todo: Cast the result to the correct object type,
        //       and update the UI
    }
}

听说过多线程吗?有关示例,请参阅此和此。

如果多线程对你来说很难,你可以先加载部分数据,然后在表单上放一些按钮,让用户获取其他部分的数据。这通常称为按需加载,实现时称为分页。想象一下,你有10000条信息记录。您可以加载前100条记录,然后让用户只在需要时加载第二条100条记录。如果你在服务器上做一些冗长的操作,而问题不是按需加载,那么唯一的方法就是使用线程:(

您可以在其他thread中获取数据,而不是在UI thread中。这样你的用户界面就不会卡住。看看这篇解释线程的文章。请记住,您不能从创建控件的线程以外的线程更新控件。要解决此问题,请查看本文。

您使用的是哪种数据?

您可以使用BackgroundWorker,或者在某些情况下有异步方法(例如,如果您调用Web服务(