使用BeginInvoke方法时如何确保局部变量的正确状态

时间:2015-08-18 10:22:25

标签: c# winforms

我有以下代码:

string message;
while (balloonMessages.TryDequeue(out message))
{
     Console.WriteLine("Outside: {0}", message);
     BeginInvoke((MethodInvoker)delegate()
     {
          Console.WriteLine("Inside: {0}", message);
     });
}

它给了我这个输出:

Outside: some_message
Inside: 

如何确保将某些局部变量按预期传递给BeginInvoke方法?

提前致谢。

2 个答案:

答案 0 :(得分:4)

你应该制作一份本地副本:

string message;
while (balloonMessages.TryDequeue(out message))
{
     var localCopy = message;
     Console.WriteLine("Outside: {0}", localCopy);
     BeginInvoke((MethodInvoker)delegate()
     {
          Console.WriteLine("Inside: {0}", localCopy);
     });
}

这样,对于每个循环迭代,它始终是它自己的变量。

答案 1 :(得分:1)

string message;
while (balloonMessages.TryDequeue(out message))
{
     var msg=message;
     Console.WriteLine("Outside: {0}", msg);
     BeginInvoke((MethodInvoker)delegate()
     {
          Console.WriteLine("Inside: {0}", msg);
     });
}

BeginInvoke不会同步运行,并且循环有时会继续而不执行Console.Writeline语句,并且消息变量中的值会更改。声明新变量可确保为beginInvoke方法保留该值