在本机C ++循环的C ++ / CLI包装器中取消BackgroundWorker

时间:2013-04-02 10:10:40

标签: c++ .net c++-cli backgroundworker

像这样post我需要在从.NET BackgroundWorker派生的C ++ / CLI类中取消BackgroundWorker。

我正在使用C ++ / CLI来包装一个运行时间很长的原生C ++函数。

我怎样才能/应该从本机C ++中长时间运行的循环访问BackgoundWorker类的CancellationPending成员?

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映射到Outline类中的bool。到目前为止,这还没有奏效。

我的大纲课程非常简单。

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

    }
};

另外还有另一种方法可以在BackgroundWorker类的CancelAsnc()函数中添加另一个处理程序,它可以以某种方式在大纲类中设置一个取消变量吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以在OnDoWork覆盖的末尾添加内容,以便不断检查BackgroundWorker::CancellationPending标记。如果为true,则将pOutline->CancellationPending设置为true。