2015-08-18 12 views
9

Tôi đã đoạn mã sau:Làm thế nào để đảm bảo trạng thái đúng của các biến địa phương khi sử dụng BeginInvoke phương pháp

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

Nó mang lại cho tôi kết quả này:

Outside: some_message 
Inside: 

Làm thế nào tôi có thể đảm bảo rằng một số các biến cục bộ sẽ được chuyển đến phương thức BeginInvoke như mong đợi?

Xin cảm ơn trước.

+3

Nó có thể do 'truy cập vào đóng cửa được sửa đổi'. –

+0

@ X-TECH Tôi đồng ý nhưng chắc chắn điều đó sẽ chỉ đúng nếu balloonMessages tin nhắn cuối cùng là một chuỗi rỗng hoặc trống? –

Trả lời

4

Bạn nên tạo một bản sao địa phương:

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

Bằng cách này, nó sẽ luôn luôn được nó biến riêng cho mỗi lần lặp.

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 không chạy đồng bộ và vòng lặp tiếp tục đôi khi không thực thi bảng điều khiển.Writeline và giá trị trong biến tin nhắn thay đổi. Khai báo biến mới đảm bảo rằng giá trị được giữ nguyên cho phương thức beginInvoke

+0

Điều này không trả lời được câu hỏi tại sao – Johan

+0

B/C BeginInvoke không chạy đồng bộ và vòng lặp tiếp tục đôi khi không thực thi câu lệnh Console.Writeline và giá trị trong biến thông báo thay đổi. Khai báo biến mới đảm bảo rằng giá trị được giữ nguyên cho phương thức beginInvoke –

+0

Xóa bỏ ghi đè và upvote. – Johan

Các vấn đề liên quan