2010-02-17 27 views
5

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

4

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.

+0

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

1

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 ControlBoxShowInTaskbar thành sai.

+0

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. –

+0

@ 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 đó. –

2

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.

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