Tôi có một ứng dụng biểu mẫu cửa sổ được viết bằng C#, trong đó tôi sử dụng một FileSystemWatcher để theo dõi một thư mục cho các tệp mới và sau đó thực hiện một số thao tác trên chúng. Ứng dụng của tôi được thiết kế để chạy trong khay hệ thống và do đó không khởi tạo bất kỳ biểu mẫu nào khi khởi động. Vấn đề là sự kiện tạo ra là bắn trên một thread riêng biệt và khi tôi cố gắng tạo một thể hiện của một biểu mẫu trong sự kiện tạo ra tôi nhận được một ThreadStateException rằng tôi cần phải chạy trong SingleThreadApartment. Tôi nghĩ rằng tôi cần phải thiết lập các tài sản FileSystemWatcher.SynchronizingObject nhưng không biết những gì để sử dụng vì không có hình thức chính trong ứng dụng của tôi.FileSystemWatcher.SynchronizingObject không có biểu mẫu
Trả lời
Bạn sẽ phải gọi Application.Run() trong phương thức Main() của bạn để lấy máy đồng bộ hóa Windows Forms tại chỗ để FileSystemWatcher có thể sắp xếp chính xác cuộc gọi đến chuỗi chính. Vấn đề bạn sẽ có sau đó là hình thức chính sẽ trở thành có thể nhìn thấy. Khắc phục điều đó bằng cách dán mã này vào lớp:
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
this.CreateHandle();
value = false;
}
base.SetVisibleCore(value);
}
Không có giới hạn về hình thức của bạn nếu bạn làm điều này.
Cách đơn giản nhất để thực hiện việc này là tạo biểu mẫu ẩn và chuyển đến Application.Run
.
Sau đó, bạn có thể đặt thuộc tính SynchronizingObject
thành biểu mẫu ẩn.
Để đảm bảo đó là biểu mẫu ẩn, hãy đặt các thuộc tính ControlBox
và ShowInTaskbar
thành sai.
Thực ra, vì 'ISynchronizeInvoke' được thực hiện bởi' Điều khiển', tôi sẽ tưởng tượng rằng nó sẽ đủ để tạo một cá thể 'Control' và gán nó cho' SynchronizingObject'. Đã không thử nó, nhưng nó có thể làm việc. –
@ FredrikMörk Không chắc chắn; một cái gì đó cần phải quay một vòng lặp trên các chủ đề chính mà thực sự sẽ thực hiện các yêu cầu gọi. Application.Run làm điều đó. –
Bạn không cần phải chuyển bất kỳ biểu mẫu nào tới số Application.Run
. Sau đó, bạn có thể tiết kiệm có để gây rối xung quanh với khả năng hiển thị hình thức. Chỉ cần thực hiện việc này:
var InvokerForm = new Form();
var dummy = InvokerForm.Handle; // force handle creation
Application.Run();
Chỉ cần một bản lưu ý ở đó - việc tạo biểu mẫu xử lý cần phải bị buộc phải truy cập một lần.
- 1. Tôi có thể cho biết biểu mẫu là biểu mẫu 'chỉnh sửa' trong mẫu không?
- 2. Gửi Biểu mẫu Không có Javascript
- 3. Biểu mẫu mùa xuân không có commandName
- 4. AntiForgeryToken không có xác thực biểu mẫu
- 5. "Không thể tạo biểu mẫu. Không có biểu mẫu MDI hiện đang hoạt động" lỗi
- 6. Biểu mẫu có hành động = ""
- 7. Có Captcha không phô trương cho biểu mẫu web không?
- 8. DialogResult không đóng biểu mẫu?
- 9. Xác thực biểu mẫu mà không có Doctrine Entity
- 10. Kiểm tra xem biểu mẫu có khóa không?
- 11. Có nên sử dụng RenderAction với biểu mẫu không?
- 12. Cách tải tệp lên mà không có biểu mẫu
- 13. đối tượng biểu mẫu không có thuộc tính 'cleaned_data'
- 14. Mã hóa Django CSRF không có biểu mẫu
- 15. Nhận mã thông báo CSRF Codeigniter không có biểu mẫu?
- 16. Các yếu tố biểu mẫu ẩn có được gửi không?
- 17. Html.ActionLink() có đăng dữ liệu biểu mẫu không?
- 18. Mẫu biểu mẫu Windows chung
- 19. Thứ tự dữ liệu trong biểu mẫu bài đăng có giống như trong biểu mẫu web không?
- 20. Thành phần biểu mẫu Symfony2 - tạo trường mà không có tên biểu mẫu trong thuộc tính name
- 21. không thể mang biểu mẫu đến trước
- 22. Biểu mẫu Django - Cách không xác thực?
- 23. Biểu mẫu Windows không định hình (C#)
- 24. Mẫu PRG có tương thích với các bài đăng biểu mẫu AJAX không?
- 25. Biểu mẫu Zend Framework 2, chúng có loại bỏ mẫu trang trí không?
- 26. Biểu mẫu HTML không gửi thông số
- 27. Biểu mẫu lồng nhau không hiển thị!
- 28. Chuyển đổi từ Biểu mẫu Windows sang Biểu mẫu Web
- 29. Làm cách nào để mở biểu mẫu trong biểu mẫu?
- 30. Biểu mẫu đóng khi không được
Làm việc như một sự quyến rũ. Ẩn hình thức thậm chí không flash trên màn hình. – AdmSteck