Как сделать статус (загрузку) показа формы - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь отобразить модальное окно при получении больших данных из базы данных.(Я использую C #.) Часть программы «извлечение данных» выполняется с помощью функции async/await, и я вызываю функцию следующим образом:

GetSomeData(sqlquery, grdControl);

И именно здесь начинается моя проблема, вобъявление GetSomeData, я поставил строку для всплывающих модальных окон, и из-за этого она не перейдет к следующей строке.

private async Task GetSomeData(string sSQL, GridControl grd)
{
    LoadingForm frmload = new LoadingForm();
    frmload.ShowDialog();
    DataTable results = await GetDataSetAsync(sSQL);
    frmload.Close();
}

Я читал темы о реализации загрузкиформы с помощью отдельной задачи или с помощью фонового работника, но если я использую это, форма загрузки больше не выглядит как модальная форма, и я хочу, чтобы фоновая форма была неактивной, что предотвращает взаимодействие с пользователем при загрузке.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

У вас может быть WaitingForm<T>, который будет ждать заданного Task<T> и закроет себя:

public partial class WaitingForm<T> : Form
{
    // ...

    Task<T> task;
    public Task<T> Task
    {
        get => task;

        set
        {
            task = value.ContinueWith((task) =>
            {
                Invoke((MethodInvoker)delegate () { Close(); });
                return task.Result;
            });
        }
    }
}

Вы можете использовать его как:

public static void Foo()
{ 
        var result = DoWithWaitingForm(() =>
        {
            Thread.Sleep(5000);
            return Task.FromResult(42);
        });

        var result2 = DoWithWaitingForm(() => Foo().Result);
    }

    // helper to deduce the type of the generic parameter for WaitingForm
    public static Task<T> DoWithWaitingForm<T>(Func<T> operation)
    {
        var form = new WaitingForm<T>
        {
            Task = Task.Run(operation),
        };
        form.ShowDialog();

        return form.Task;
    }

    // example async function
    async static Task<int> Foo()
    {
        return await Task.Run(() =>
        {
            Thread.Sleep(5000);
            return Task.FromResult(42);
        });
    }
0 голосов
/ 12 июня 2018

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

Вы должны переместить DataTable results = await GetDataSetAsync(sSQL); в ваше модальное окно.

Вы можете передавать результаты DataTable и sSQL вваше модальное окно и выполните команду Get there:

DataTable results;
LoadingForm frmload = new LoadingForm(results, sSQL);
frmload.ShowDialog();
// Your data should be ready here

Внутри LoadingForm:

results = await GetDataSetAsync(sSQL);
this.Close()
...