2012-04-04 65 views
6

Nếu bạn có dịch vụ cửa sổ và một ứng dụng biểu mẫu cửa sổ sử dụng cùng một đối tượng tĩnh, đó có phải là cùng một đối tượng trong cả hai ứng dụng không? Nói cách khác, nếu tôi cập nhật đối tượng trong dịch vụ thì nó cũng sẽ được cập nhật trong ứng dụng biểu mẫu nếu cả hai đang chạy cùng một lúc?Là một đối tượng tĩnh cùng một đối tượng trong nhiều ứng dụng đang chạy?

Trả lời

8

Chúng chạy trên các quy trình khác nhau để chúng không chia sẻ đối tượng tĩnh.

Không có liên quan đến exaclty với câu hỏi của bạn nhưng các chuỗi được tạo trên cùng một ứng dụng là một câu chuyện khác. Họ sẽ chia sẻ biến tĩnh trừ khi được đánh dấu bằng ThreadStatic thuộc tính

0

Tôi nghĩ rằng mỗi ứng dụng chạy trong Quy trình riêng của nó. Tôi thực sự nghi ngờ rằng việc cập nhật một đối tượng tĩnh trong dịch vụ Windows có bất kỳ tác động nào đối với đối tượng tĩnh đang chạy dưới dạng ứng dụng biểu mẫu Windows.

Dịch vụ Windows chạy dưới system tài khoản khi ứng dụng biểu mẫu Windows chạy dưới tài khoản User.

Như những người khác đã chỉ ra trong các nhận xét, các quy trình chạy trong bộ nhớ khác nhau. Mỗi quy trình có không gian địa chỉ riêng của nó.

Dịch vụ Windows trả lời các lệnh Trình quản lý kiểm soát dịch vụ.

Chúng hoàn toàn là hai thứ khác nhau.

+2

Điều này không liên quan gì đến tài khoản người dùng. Các quy trình khác nhau có không gian bộ nhớ riêng biệt và do đó không chia sẻ dữ liệu theo mặc định. –

+0

@BrianRasmussen hoàn toàn - Sandeep bạn có lẽ nên chỉnh sửa nó một chút. – NSGaga

2

No. Trừ khi bạn làm điều gì đó cụ thể để đạt được các đối tượng này không được chia sẻ giữa các quy trình khác nhau.

0

Câu trả lời đơn giản cho điều này là mỗi quy trình có tĩnh của riêng nó nên không, nó sẽ không được chia sẻ giữa quá trình dịch vụ và máy tính để bàn.

Phần phức tạp là thậm chí có thể có nhiều trường hợp tĩnh trong một quá trình duy nhất.

Trong Java có một phiên bản của đối tượng tĩnh cho mỗi ClassLoader tải lớp đó. Tôi đã kiểm tra chức năng tương đương trong C#. Tôi tìm thấy this question on SO cho thấy rằng thực sự có điều gì đó tương tự với nhiều trình nạp lớp trong số C# (tôi thực sự ở số CLR) và mặc dù tôi không tìm thấy bất kỳ tham chiếu cụ thể nào cho nhiều trường hợp tĩnh Tôi chắc chắn rằng đó là trường hợp.

0

một cách đơn giản không,
tĩnh là 'static per AppDomain' (và bạn có thể có nhiều tên miền cho mỗi quá trình), vì vậy không ngay cả đối với một quy trình an toàn để giả định rằng các biến tĩnh của bạn sẽ được 'chia sẻ' (thường là đúng trừ bạn tạo tên miền mới bằng tay, ví dụ: xem What is AppDomain?) - ví dụ các ứng dụng web thường phá vỡ các phần tử 'tĩnh', v.v.
Nói cách khác, bạn cần phải sử dụng một số loại kiên trì để có thể chia sẻ dữ liệu của mình giữa các ứng dụng khác nhau. Hoặc sử dụng từ xa, WCF để giao tiếp qua các ranh giới ứng dụng (tên miền).

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