Как загрузить пользовательский интерфейс независимо от данных - PullRequest
1 голос
/ 05 июля 2011

Я создаю приложение, используя c # и базу данных в webserver. При доступе к данным с веб-сервера, это очень медленно, и форма также зависает, пока данные не загружены. Есть способ загрузить форму сначала иданные позже?

Ответы [ 5 ]

3 голосов
/ 05 июля 2011

Обычный способ решить эту проблему - использовать класс 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
    }
}
2 голосов
/ 05 июля 2011

Если многопоточность затруднительна для вас, вы можете сначала загрузить часть этих данных, а затем добавить в форму некоторые кнопки, чтобы позволить пользователю извлекать другие части данных. Обычно это называется загрузкой по требованию, а при реализации - подкачкой. Представьте, что у вас есть 10000 записей информации. Вы можете загрузить первые 100 записей, а затем позволить пользователю загружать вторые 100 записей только тогда, когда он хочет. Если вы выполняете какие-то длительные операции на сервере и проблема не в загрузке по требованию, тогда единственный способ - использовать многопоточность:)

2 голосов
/ 05 июля 2011

Слышал о многопоточности? см. this и this для примеров.

1 голос
/ 05 июля 2011

Какие данные вы используете?

Вы можете использовать BackgroundWorker или, в некоторых случаях, есть асинхронные методы (например, если вы вызываете webservivce)

1 голос
/ 05 июля 2011

Вы можете получить данные в другом thread, а не в UI thread. Таким образом, ваш интерфейс не застревает. Посмотрите на этот пост, объясняющий threading . Помните, что вы не можете обновить элементы управления из потока, отличного от потока, в котором он был создан. Чтобы решить эту проблему, взгляните на этот пост .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...