0

像这篇文章一样,我需要取消派生自 .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 类中的布尔值。到目前为止,这还没有奏效。

我的大纲课程相当简单。

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() 函数添加另一个处理程序,该处理程序可以以某种方式在大纲类中设置取消变量?

谢谢。

4

1 回答 1

0

您可以在OnDoWork覆盖的末尾添加一些内容以不断检查BackgroundWorker::CancellationPending标志。如果为真,pOutline->CancellationPending也设置为真。

于 2013-06-25T21:29:00.593 回答