簡體   English   中英

使用BeginInvoke方法時如何確保局部變量的正確狀態

[英]How to ensure the correct state of local variables when using BeginInvoke method

我有以下代碼:

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方法?

提前致謝。

你應該制作一份本地副本:

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

這樣,對於每個循環迭代,它始終是它自己的變量。

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方法保留該值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM