2010-03-16 27 views
5

Tôi đã có đoạn mã sau:Me.Invoke trong VB.NET không thực sự "Gọi" - chủ đề trì hoãn trên Invoke tuyên bố

Public Delegate Sub SetStatusBarTextDelegate(ByVal StatusText As String) 
Private Sub SetStatusBarText(ByVal StatusText As String) 
    If Me.InvokeRequired Then 
     Me.Invoke(New SetStatusBarTextDelegate(AddressOf SetStatusBarText), StatusText) 
    Else 
     Me.labelScanningProgress.Text = StatusText 
    End If 
End Sub 

Vấn đề là, khi tôi gọi là "SetStatusBarText" phụ từ một chủ đề khác, InvokeRequired là True (vì nó nên được), nhưng sau đó đề tài của tôi gian hàng trên Me.Invoke tuyên bố - tạm dừng thực hiện cho thấy tất cả họ chỉ ngồi đó, không thực sự gọi bất cứ điều gì.

Bất kỳ suy nghĩ nào về việc tại sao các luồng có vẻ sợ Invoke?

Trả lời

5

Phương thức Gọi sẽ đặt một thông báo trong hàng đợi tin nhắn để thực hiện cuộc gọi phương thức trong chuỗi chính. Điều này có nghĩa rằng bạn cần một chủ đề chính với một máy bơm tin nhắn. Nếu luồng chính đang bận hoặc nếu bạn đang thực hiện việc này trong một ứng dụng mà không cần bơm thông báo (ví dụ: ứng dụng bảng điều khiển), thông báo sẽ vẫn nằm trong hàng đợi.

+1

Đó là chính xác những gì đang diễn ra - "Me.Invoke" đang đợi chuỗi chính trả lời, nhưng chủ đề chính vẫn bận rộn nhồi nhét nội dung vào Threadpool khi chuỗi đầu tiên kết thúc. Cảm ơn lời khuyên của bạn. – SqlRyan

+1

Cảm ơn! Tôi đã chờ đợi Invokes kết thúc nhưng tất cả đều bị đóng băng. Tôi đã thêm một cuộc gọi đến System.Windows.Forms.Application.DoEvents() và nó hoạt động. –

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