我试图定期收集数据,这可能需要时间,然后一旦我整理了所有数据,就在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”永远不会触发。
感谢所有的帮助。