2010-08-13 9 views
10

C# Câu hỏi - Tôi đang cố gắng để xác định xem nó là OK để sử dụng một phương pháp tĩnh, trong phương pháp nó có một số biến địa phương nó sử dụng. Có phải các biến cục bộ "được chia sẻ" trong các tập quán của phương pháp này không? Điều gì sẽ xảy ra ví dụ nếu phương thức tĩnh đang được gọi/được sử dụng cùng một lúc từ các luồng khác nhau? Có một sợi chặn cho đến khi khác hoàn thành vv?Phương thức tĩnh có chia sẻ các biến cục bộ của nó và điều gì sẽ xảy ra trong quá trình sử dụng đồng thời từ các luồng khác nhau?

Có lẽ câu hỏi tổng quát là, trong một ứng dụng luồng, khi nào thì một "không" đang sử dụng một phương pháp tĩnh?

Trả lời

20

Biến cục bộ trong phương thức trực tiếp trên ngăn xếp và mỗi chuỗi có ngăn xếp riêng. Vì vậy nó an toàn cho nhiều chủ đề để sử dụng phương pháp.

Tuy nhiên, nếu chính phương thức đó sử dụng biến tĩnh thì bạn nên sử dụng bảo vệ MT phù hợp. Ngoài ra, các phương thức bên ngoài mà bạn có thể đang gọi cần phải an toàn ...

1

Không có phương pháp nào thuộc loại C# chia sẻ biến cục bộ.

Bạn có thể nghĩ đến các chức năng tĩnh trong VB.

+2

... ngoại trừ đóng cửa – Tergiver

1

Có nhiều lý do để sử dụng các phương pháp tĩnh trong các ứng dụng đa luồng. Không có gì sai với điều đó. Miễn là bạn không thay đổi bất kỳ biến toàn cục nào (không khóa), bạn sẽ không gặp vấn đề gì ở đó.

3

Biến địa phương "được chia sẻ" trong tập quán của phương pháp?

Không, chúng không có. Mỗi luồng thực hiện phương thức có bản sao riêng của các biến cục bộ và chúng độc lập với nhau. Khi phương thức trả về, bản sao cụ thể của người dân địa phương cho chủ đề cụ thể đó bị loại bỏ. (*)

Điều gì sẽ xảy ra ví dụ nếu phương pháp tĩnh đang được gọi/sử dụng cùng lúc với các chủ đề khác nhau? Có một sợi chặn cho đến khi khác hoàn thành vv?

Không, chúng không; họ sẽ chỉ thực hiện phương thức trên hai ngăn xếp riêng biệt cùng một lúc. Nếu bạn thực sự muốn muốn chặn, hãy sử dụng lock statement, nguyên nhân gây ra chuỗi thứ hai đi vào câu lệnh khóa để đợi cho đến khi chuỗi đầu tiên trả về từ báo cáo khóa. Điều này có thể cần thiết nếu phương thức của bạn truy cập (các trường không phải cục bộ), là các dữ liệu được chia sẻ.

Trong ứng dụng luồng, khi nào thì không sử dụng phương pháp tĩnh?

Cho dù bạn nên sử dụng phương pháp tĩnh hay không phụ thuộc vào phương pháp yêu cầu đối tượng hoạt động, nhưng không có gì liên quan đến việc ứng dụng của bạn có đa luồng hay không. Đối với mục đích của luồng, một phương pháp tĩnh là không có gì đặc biệt so với một phương pháp không tĩnh.

(*) Điều này có thể không còn đúng nếu bạn có biểu thức lambda hoặc phương thức ẩn danh bên trong phương pháp sử dụng biến cục bộ, nhưng đây là tính kỹ thuật.