如果Argument(数组)更改大小,BackgroundWorker不会触发RunWorkerCompleted

时间:2013-02-21 23:07:33

标签: c# backgroundworker

我试图定期收集数据,这可能需要时间,然后一旦我整理了所有数据,就在GUI线程中使用它。数据可以改变 - 有时只有1条消息,有时只有几条消息。

如果我使用一个简单示例并将字符串传递给RunWorkerAsync(),则通过在DoWork函数中设置e.Result来更改字符串,调用RunWorkerCompleted(并在e.Result中使用新字符串)。

如果我将一个数组初始化为空并将其传递给RunWorkerAsync,则填充此数组,使用Array.Resize()更改其大小,并将此结果作为e.Result传回,然后RunWorkerCompleted永远不会触发。

我做错了什么?

代码示例(已编辑 - 此确切示例失败):

    public struct MessageStruct
    {
        public string Type;
        public Color Colour;
        public Image Separator;
        public string Message;
        public int Index;
    }

    private void RefreshMessages()
    {
        MessageStruct[][] MarqueeMessage = new MessageStruct[0][];
        bgw.RunWorkerAsync(MarqueeMessage);
    }

    void WorkerThread(object state, DoWorkEventArgs e)
    {
        MessageStruct[][] MarqueeMessage = e.Argument as MessageStruct[][];
        Array.Resize(ref MarqueeMessage, 1);
        Array.Resize(ref MarqueeMessage, 2);
        Array.Resize(ref MarqueeMessage, 3);
        Array.Resize(ref MarqueeMessage[2], 1);
        Array.Resize(ref MarqueeMessage[2], 2);
        Array.Resize(ref MarqueeMessage, 4);
        Array.Resize(ref MarqueeMessage[3], 1);
        Array.Resize(ref MarqueeMessage[3], 2);

        e.Result = MarqueeMessage;
    }

    void WorkerDone(object state, RunWorkerCompletedEventArgs e)
    {
        //never get here
        MessageStruct[][] MarqueeMessage = e.Result as MessageStruct[][];
    }

单步执行代码,e.Result在“WorkerThread”中设置后立即看起来正确,但随后应用程序挂起,“WorkerDone”永远不会触发。

感谢所有的帮助。

0 个答案:

没有答案