Отображение диалогового окна «Пожалуйста, подождите» для задачи, не поддерживающей поток - PullRequest
1 голос
/ 16 ноября 2009

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

Обычно я бы делал что-то вроде этого:

Thread longTask = new Thread (new ThreadStart(LongTask));
longTask.IsBackgroud = true;
longTask.Start();

pleaseWaitForm = new PleasWaitForm ("Please wait for task to complete");
pleaseWaitForm.ShowDialog();

void LongTask()
{
    // Do time consuming work here

    pleaseWaitForm.CanCloseFlag = true;
}

К сожалению, сторонняя библиотека не является поточно-ориентированной. Есть обходные пути? Есть ли способ управления диалоговым окном в качестве фоновой задачи?

Ответы [ 3 ]

2 голосов
/ 16 ноября 2009

Я думаю, что вы неправильно понимаете, что означает "потокобезопасность". Если вы собираетесь вызывать методы / свойства вашего стороннего компонента только из одного потока, этот компонент не обязательно должен быть потокобезопасным. См. эту статью.

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

НТН

1 голос
/ 16 ноября 2009

Вам в значительной степени необходимо создать собственное диалоговое окно.

Один из вариантов - опросить ваш флаг completed по таймеру или тому подобное.

Еще один вариант - позволить форме «владеть» задачей и использовать BackgroundWorker для уведомления о ходе выполнения и завершении.

0 голосов
/ 16 ноября 2009

Предположим, у вас есть метод LongTask, и он не является потокобезопасным. Если этот метод работает и ему не нужны никакие общие переменные, вы можете просто обернуть его вокруг BackgroundWorker и обновить экран «Пожалуйста, подождите», как только задача завершится.

Если определенный метод не является потокобезопасным, это может означать, что его можно безопасно использовать в потоке, он просто зависит от того, выполняется ли он несколько раз асинхронно (опасность!) Или синхронно (не проблема).

...