2009-04-08 29 views
13

Tôi có một khía cạnh nhắn tin của ứng dụng của tôi sử dụng Jabber-net (một XMPP library.)Do Bộ định thời .NET chạy không đồng bộ?

Những gì tôi muốn làm, nếu vì một lý do nào kết nối đến máy chủ được kết thúc, là tiếp tục cố gắng để kết nối mỗi phút hoặc lâu hơn.

Nếu tôi khởi động Bộ hẹn giờ để chờ một khoảng thời gian trước lần thử kế tiếp, bộ hẹn giờ đó chạy không đồng bộ và kết quả sự kiện Tick tham gia chủ đề chính hay tôi cần bắt đầu chuỗi của riêng mình và khởi động bộ hẹn giờ từ trong đó?

Trả lời

35

Bạn đang sử dụng loại bộ hẹn giờ nào?

  • System.Windows.Forms.Timer sẽ thực hiện trong thread UI
  • System.Timers.Timer thực hiện trong một thread bơi trừ khi bạn chỉ định một SynchronizingObject
  • System.Threading.Timer thực hiện gọi lại nó trong một thread-pool

Trong tất cả các trường hợp, chính bộ hẹn giờ sẽ không đồng bộ - nó sẽ không "mất" một chuỗi cho đến khi nó cháy.

+0

Hãy nhớ rằng nếu bạn không sử dụng System.Windows.Forms.Timer truy cập vào một điều khiển sẽ ném một ngoại lệ trừ khi bạn thực hiện kiểm tra và yêu cầu InvokeRequired thích hợp. –

+0

Bạn nói đúng, Trong câu hỏi của tôi, tôi nên nói rằng tôi không chắc tôi nên sử dụng bộ hẹn giờ nào. Nhìn vào ba tùy chọn bạn đã cung cấp và đọc MSDN System.Timers.Timer trông giống như một trong những quyền cho trường hợp này như trên Tick một cuộc gọi sẽ cần phải được thực hiện cho một đối tượng được tạo ra trong chủ đề chính. – MrEdmundo

+0

@MrEdmundo: Ý chính xác của "chủ đề chính" là gì? –

1

Bộ hẹn giờ sẽ chạy ở chế độ nền và thực hiện các sự kiện trong chuỗi chính của bạn.

+0

Cảm ơn, tôi đã nghĩ như vậy, chỉ cần nghe nó với ai đó. – MrEdmundo

1

Tôi không chắc cách bộ hẹn giờ trong .NET được triển khai, nhưng nếu chúng sử dụng API cửa sổ để tạo bộ đếm thời gian, vòng lặp tin nhắn nhận được thông báo WM_TIMER và chỉ khi chuỗi biểu mẫu không bận yêu cầu, vì vậy bộ hẹn giờ sẽ kích hoạt vào đúng thời điểm, nhưng bạn có thể trì hoãn chuỗi giao diện người dùng. Bộ hẹn giờ sẽ được bắt đầu với API SetTimer và hệ điều hành sẽ đảm bảo đăng thông báo WM_TIMER.

Tôi đã kiểm tra, chỉ System.Windows.Forms.Timer+TimerNativeWindow.StartTimer(Int32) phụ thuộc vào:

[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] 
public static extern IntPtr SetTimer(HandleRef hWnd, int nIDEvent, int uElapse, IntPtr lpTimerFunc); 

Vì vậy, chỉ hẹn giờ này có "vấn đề" được mô tả.

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