Попытка добавить всплывающее окно ожидания при выполнении длинного процесса, всплывающее окно показывает, но процесс никогда не запускается - PullRequest
2 голосов
/ 06 апреля 2020

Итак, у меня есть процесс, который немного запускается с большими файлами, и я хочу добавить всплывающее окно «Please Wait .... Processing ...», чтобы знать, как оно работает над своими задачами.

Я следовал этот пример видео на youtube C# Оптимизация формы ожидания

Реализовано так же, как в примере, но метод, который фактически выполняет работу, никогда не запускается

Это моя форма обработки logi c, который отображается, когда я запускаю все приложение

public partial class Processing : Form
{
    public Action Worker { get; set; }

    public Processing(Action worker)
    {            
        InitializeComponent();
        if(worker==null)
            throw new ArgumentNullException();
            Worker = worker;
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        Task.Factory.StartNew(Worker).ContinueWith(t => { this.Close(); }, TaskScheduler.FromCurrentSynchronizationContext());
    }
}

Тогда я вызываю его с помощью нажатия моей кнопки

    private void btnFilters_Click(object sender, EventArgs e)
    {
        using (Processing pc = new Processing(ParseFilteredData))
        {
            pc.ShowDialog(this);
        }
        //ParseFilteredData();
    }

Почему выполняется ParseFilteredData, но не выполняется обновить основную форму? Я прошел через код, и он выполняет метод, но мой пользовательский интерфейс не отражает данные.

Пожалуйста, имейте в виду, что мой ParseFilteredData работает, если вы закомментируете оператор using и просто запускаете метод по нажатию кнопки, через несколько минут все мои списки заполнятся.

1 Ответ

2 голосов
/ 06 апреля 2020

Итак, я сделал несколько изменений в своем коде, я переместил всю привязку источника данных из моего метода ParseFilteredData в свой собственный, поэтому ParseFilteredData теперь просто создает таблицы данных, которые занимают много времени. Затем после оператора Using я вызываю мой новый метод, и все заполняется и отображается

    private void btnFilters_Click(object sender, EventArgs e)
    {
        using (Processing pc = new Processing(ParseFilteredData))
        {
            pc.ShowDialog(this);
        }
        BindAllListBoxes();
    }

. Я также переместил таблицы данных за пределы метода и просто заполнил их вместо инициализации и заполнения всех одновременно. Это позволило получить доступ к таблицам данных вне этого метода.

Поэтому, чтобы мой код работал так, как я хотел, мне пришлось разделить мой метод ParseFilteredData. Кажется, теперь он работает как шарм.

Спасибо, Фрэнк, за предложение.

...