Lời chào, Tôi đang phát triển một số ứng dụng trong C#. Tại thời điểm này tôi đang đối phó với luồng và tôi có một câu hỏi mà tôi có trong tâm trí của tôi. Sự khác nhau giữa Invoke và BeginInvoke là gì? Tôi đọc một số chủ đề và tôi tìm thấy một số thông tin hữu ích ở đây: hereGọi và BeginInvoke
Tuy nhiên sự khác biệt giữa Invoke và BeginInvoke trong đoạn mã sau là gì:
private void ProcessRoutine()
{
for (int nValue = StartFrom; nValue <= EndTo; nValue++)
{
this.Invoke(this.MyDelegate, nValue);
//this.BeginInvoke(this.MyDelegate, nValue);
}
MessageBox.Show("Counting complete!");
}
private void MessageHandler(int progress)
{
lblStatus.Text = lblStatus.Text = "Processing item: " + progress.ToString();
progressBar1.Value = progress;
}
nơi MyDelegate là một tham chiếu đến chức năng MessageHandler.
Tôi nhận thấy rằng việc sử dụng BeginInvoke lblStatus.Text không được làm mới khi sử dụng Invoke làm mới nhãn. Ngoài ra tôi biết rằng Invoke chờ đợi để thực hiện của nó để hoàn thành. Trường hợp quan trọng nhất mà tôi quan tâm là tại sao có sự khác biệt trong văn bản nhãn làm mới trong trường hợp này.
Calling BeginInvoke không có nghĩa là nó không thực hiện trên giao diện người dùng chủ đề. Nó có nghĩa là nó được gọi là không đồng bộ trên chuỗi liên kết với "this" có thể là chuỗi giao diện người dùng. –
vì vậy nếu nó không phải trong một chủ đề khác, làm thế nào nó hoạt động sau đó? –
Từ MSDN: "Thực thi đại biểu được chỉ định không đồng bộ trên chuỗi mà điều khiển bên dưới của điều khiển được tạo trên". Vì vậy, nếu nó được gọi là từ các chủ đề giao diện người dùng, nó sẽ được đặt trên một hàng đợi và thực hiện khi các chủ đề giao diện người dùng nó nhàn rỗi. Mà sẽ được sau khi phương pháp hiện đang thực hiện đã trở lại. –