Как это сообщение Мне нужно отменить BackgroundWorker в классе C ++ / CLI, производном от .NET BackgroundWorker.
Я использую C ++ / CLI, чтобы обернуть давно работающую унаследованную функцию C ++.
Как я могу / должен получить доступ к члену CancellationPending класса BackgoundWorker из долгого цикла в нативном C ++?
public ref class BackgroundWorkerWrapper : BackgroundWorker
{
private:
Outline* pOutline;
public:
BackgroundWorkerWrapper(void)
{
WorkerReportsProgress = true;
pOutline = new Outline;
// pOutline->CancellationPending = &(BackgroundWorker::CancellationPending);
}
protected:
virtual void OnDoWork(DoWorkEventArgs ^e) override {
pOutline->DoWork();
BackgroundWorker::OnDoWork(e);
}
};
Выше вы можете видеть, что я пытался отобразить CancellationPending в bool в классе Outline. Пока что это не сработало.
Мой класс Outline довольно прост.
public class Outline
{
public:
bool* CancellationPending;
Outline()
{
}
~Outline()
{
}
void DoWork()
{
try
{
for (int i=0; i < 1000; i++)
{
if (CancellationPending[0] == true)
{
break;
}
// Do some trivial work
Sleep(50);
}
}
// catch(...)
catch (exception& e)
{
cout << e.what() << endl;
}
}
};
Альтернативно, есть ли другой способ добавить другой обработчик в функцию CancelAsnc () класса BackgroundWorker, которая могла бы каким-то образом установить переменную отмены в классе структуры?
Благодарю.
Вы могли бы добавить что-то в конце вашего OnDoWork
переопределить, чтобы постоянно проверять BackgroundWorker::CancellationPending
флаг. Если true, установите pOutline->CancellationPending
к истине тоже.
Других решений пока нет …