Tôi có thư viện C# muốn có khả năng Gửi/Đăng làm việc với chuỗi chủ đề "chính" (nếu có). thư viện này có thể được sử dụng bởi:Chụp chủ đề chính SynchronizationContext hoặc Dispatcher từ thư viện
- Một ứng dụng winforms
- Một ứng dụng bản địa (với giao diện người dùng)
- Một ứng dụng giao diện điều khiển (không có giao diện người dùng)
Trong thư viện tôi muốn muốn capture cái gì đó (A SynchronizationContext, Dispatcher, Task Scheduler, hoặc cái gì khác) trong quá trình khởi tạo, nó sẽ cho phép tôi (sau này) Send/Post làm việc với thread chính (nếu thread chính có khả năng đó) -ie nó có một máy bơm tin nhắn). Ví dụ, thư viện muốn tạo một số giao diện người dùng Winforms trên luồng chính nếu và chỉ khi ứng dụng chính có khả năng cho tôi để có được chủ đề chính.
Những điều tôi đã cố gắng:
- Một SynchronizationContext:. Chụp làm việc này tốt cho một ứng dụng Winforms (một WindowsFormsSynchronizationContext sẽ được cài đặt như các Current SynchronizationContext này cũng hoạt động tốt cho các ứng dụng giao diện điều khiển - kể từ Tôi có thể phát hiện ra rằng SynchronizationContext hiện tại là null (và do đó, biết rằng tôi không có khả năng gửi/bài làm việc với chủ đề chính) .Vấn đề ở đây là ứng dụng UI gốc: Nó có khả năng (nghĩa là nó có một máy bơm tin nhắn), nhưng bối cảnh Đồng bộ hóa hiện tại là null và do đó tôi không thể phân biệt nó với trường hợp ứng dụng Console. Nếu tôi có thể phân biệt, thì tôi có thể đơn giản cài đặt một WindowsFormsSynchronizationContext trên chủ đề chính, và tôi tốt để đi.
- A Dispatcher: Chụp hình này bằng cách sử dụng Current tạo SynchronizationContext mới. Vì vậy, trong mọi tình huống tôi sẽ lấy lại một Dispatcher. Tuy nhiên, đối với ứng dụng Console, sử dụng
Dispatcher.Invoke
từ chuỗi nền sẽ treo (như mong đợi). Tôi có thể sử dụngDispatcher.FromThread
(mà không tạo ra một Dispatcher cho chủ đề nếu một không tồn tại). Nhưng ứng dụng UI gốc sẽ trả về một Dispatcher rỗng bằng cách sử dụng phương thức này, và vì vậy, tôi lại bị kẹt không thể phân biệt ứng dụng giao diện người dùng với ứng dụng giao diện điều khiển. - A TaskScheduler: Tôi có thể sử dụng FromCurrentSynchronizationContext. Điều này có cùng một vấn đề như SynchronizationContext. I E. Trước khi gọi FromCurrentSyncronizationContext, tôi phải kiểm tra xem Current SynchronizationContext có là null hay không (đây là trường hợp của ứng dụng Console và ứng dụng ui gốc). Vì vậy, một lần nữa tôi không thể phân biệt ứng dụng gốc ui từ ứng dụng giao diện điều khiển.
Tôi, tất nhiên, có thể cho người dùng thư viện của tôi chỉ định ứng dụng UI khi họ gọi phương thức Initialize
của tôi, nhưng tôi hy vọng tránh sự phức tạp đó đối với người dùng thư viện nếu có thể .
Tôi đang sử dụng thư viện C# trong MFC. Thư viện này đã nhận được cuộc gọi TaskScheduler.FromCurrentSynchronizationContext(). khi tôi chạy ứng dụng MFC nó ném ngoại lệ nói rằng 'hiện tại SynchronizationContext có thể không được sử dụng như một TaskScheduler'.Any ý tưởng làm thế nào để đối phó với nó?Tôi không trực tiếp sử dụng thư viện C# trong MFC, nhưng tôi đã tạo ra một wrapper trong quản lý C + + và tôi đang sử dụng wrapper này trong ứng dụng MFC. –