2009-11-16 4 views
1

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

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

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

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

+2

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

+0

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

ответ

1

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

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

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

0

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

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

2

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

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

HTH