Отображение диалогового окна «Подождите» для задачи, не поддерживающей потокобезопасность

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

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

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;
}

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


person sanger    schedule 16.11.2009    source источник
comment
Что вы имеете в виду, что это не потокобезопасно? Не похоже, чтобы ваша проблема была связана с этим. Не могли бы вы уточнить.   -  person Brian Rasmussen    schedule 16.11.2009
comment
Если он не является потокобезопасным, это просто означает, что он не может быть надежно использован более чем одним потоком одновременно. Кажется, вы используете один фоновый поток, так что все должно быть в порядке. Вы получаете какую-то ошибку/состояние гонки, которое заставило вас пересмотреть свой дизайн?   -  person Ryan Emerle    schedule 16.11.2009


Ответы (3)


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

Кроме того, я бы посоветовал вам использовать в этом случае класс background worker. .

ХТН

person unclepaul84    schedule 16.11.2009

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

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

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

person John Gietzen    schedule 16.11.2009

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

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

person Abel    schedule 16.11.2009