我有以下代码:
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
方法?
提前致谢。
答案 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方法保留该值