2009-04-23 42 views
5

Tôi đã nhìn thấy rất nhiều cuộc thảo luận về chủ đề này ở đây.Câu hỏi về C# và lớp và chức năng tĩnh

Nếu tôi có một lớp tĩnh w/phương thức tĩnh kết nối với cơ sở dữ liệu hoặc máy chủ, có nên sử dụng điều này trong môi trường nhiều người dùng (như trang web) không? Điều này có khiến cho người dùng mới phải chờ đợi chủ đề của người dùng trước để kết thúc cuộc gọi của họ trước khi chấp nhận cuộc gọi mới không?

Điều gì sẽ là tác động của điều này với đa luồng cũng?

Thx!

Trả lời

6

Nếu mỗi phương pháp tĩnh hoàn toàn chịu trách nhiệm thu thập các nguồn lực của nó và sau đó xử lý của nó tài nguyên trong phạm vi của cuộc gọi phương thức (không có trạng thái chia sẻ), thì bạn không nên gặp bất kỳ vấn đề nào với luồng mà bạn sẽ không sử dụng các lớp thể hiện. Tuy nhiên, tôi sẽ đề nghị rằng vấn đề lớn hơn là sự phụ thuộc vào các phương thức tĩnh công cộng (trong các lớp tĩnh hoặc không tĩnh) tạo ra nhiều vấn đề thiết kế khác trên đường.

  • Trước hết, bạn đang ràng buộc rất chặt chẽ với việc triển khai, điều này luôn xấu.
  • Thứ hai, kiểm tra tất cả các lớp phụ thuộc vào phương pháp tĩnh của bạn trở nên rất khó thực hiện, bởi vì bạn bị khóa trong một lần triển khai đơn lẻ. Thứ ba, nó trở nên rất dễ dàng để tạo ra các phương pháp an toàn phi thread vì các phương thức tĩnh chỉ có thể có trạng thái tĩnh (được chia sẻ trên tất cả các cuộc gọi phương thức).
0

Một chút lạ lùng bởi câu hỏi này. Về lý do tại sao bạn có quá nhiều hoạt động tĩnh.

Nhưng tôi nghĩ rằng bạn đang hỏi về luồng vấn đề này, vì vậy tôi sẽ nói đi kiểm tra một số các tài liệu trên luồng h ttp://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx

0

Tĩnh chỉ xác định phạm vi nơi phương thức được xác định và cách thức được liên kết/gọi. Nó không có gì để làm với đa luồng.

Bạn cần phải cẩn thận với các trường tĩnh. Chúng được chia sẻ bởi tất cả các chủ đề. Chủ đề không chờ đợi nhau, nhưng bạn cần khóa để làm cho nó hoạt động.

Nhưng nếu ứng dụng của bạn phức tạp hơn một chút so với Hello World, bạn nên xem xét để có phương pháp không tĩnh nhưng sử dụng các mẫu hướng đối tượng.

3

Phương pháp tĩnh không có bất kỳ hành vi đặc biệt nào đối với đa luồng. Tức là, bạn có thể mong đợi một vài "bản sao" của phương thức chạy cùng một lúc. Điều tương tự cũng xảy ra đối với các biến tĩnh - các luồng khác nhau có thể truy cập chúng cùng một lúc, không có chờ đợi ở đó. Và trừ khi bạn cẩn thận, điều này có thể tạo ra hỗn loạn.

1

Vâng, đó là một ý tưởng tồi.

Khi bạn sử dụng một kết nối cho tất cả người dùng của bạn nếu ai đó thực hiện một hành động mà đòi hỏi, cho phép nói 15 giây, chỉ để truy cập cơ sở dữ liệu, tất cả những người dùng khác sẽ phải chờ đợi để kết nối với cơ sở dữ liệu

+0

Ý tưởng tồi ở đây là sử dụng một kết nối, không phải là phương pháp tĩnh, IMO. –

+0

Tôi đồng ý với bạn – Sergio

0

Nếu bạn sử dụng một kết nối tĩnh để truy cập cơ sở dữ liệu, bạn sẽ phải đồng bộ hóa các cuộc gọi phương thức. Nhiều luồng yêu cầu cơ sở dữ liệu cho dữ liệu qua một kết nối sẽ ... ehhmmm ... làm mọi thứ lộn xộn. Vì vậy, bạn đang serializing tất cả các chủ đề truy cập dữ liệu và điều này sẽ có một tác động lớn đến hiệu suất.

Nếu mọi cuộc gọi mở kết nối riêng, bạn không cần phải sắp xếp từng chuỗi chủ đề vì không có kết nối được chia sẻ. Tạo một kết nối cho mỗi yêu cầu vẫn là một thiết kế đắt tiền.

Nếu bạn sử dụng nhóm kết nối tĩnh, bạn sẽ giảm tác động hiệu suất này vì bạn chỉ cần tuần tự hóa quyền truy cập vào nhóm kết nối.

Hơn nữa, thống kê nói chung không phải là thiết kế tốt - chúng làm cho việc kiểm tra đơn vị trở nên phức tạp. Bạn nên cân nhắc sử dụng mẫu Singleton hoặc Monostate.

0

Nếu bạn làm điều đó phải, sẽ không có vấn đề gì. Nếu bạn làm điều đó sai, nó có khả năng truy cập tuần tự lực vào tài nguyên.

Đôi khi sự khác biệt giữa đúng và sai có thể rất tinh tế và khó phát hiện, nhưng điều chính là không nên dựa vào hoặc khóa bất kỳ "trạng thái" nào của lớp.

0

Tôi sử dụng phương pháp tĩnh cho các đối tượng tra cứu. Tôi có thể quản lý tất cả các đối tượng tra cứu ở một nơi (sử dụng bộ nhớ đệm) cho ứng dụng asp.net và tất cả các phương thức gọi nó bằng cách sử dụng phương thức tĩnh.

Bằng cách này, tôi không cần phải nhanh chóng tìm kiếm đối tượng tra cứu mỗi khi tôi cần nó và nó làm giảm sự cần thiết phải gọi DB để nâng cao hiệu suất.