Tôi đang viết một ứng dụng có giao diện truyền thông lớp.
Điều này được thực hiện để trừu tượng hóa các giao tiếp từ phần giao diện người dùng của ứng dụng và cũng để làm cho nó có khả năng mở rộng/duy trì hơn.
Ví dụ:Xử lý các điều kiện Race trong C#
xem xét mỗi hộp trong hình trên như là một lớp riêng biệt.
Giao diện chung của giao diện phổ biến các biến chuỗi mô tả dữ liệu được giao dịch và liên kết "sức khỏe", lần lượt được sao chép lên Ứng dụng thông qua một loạt các cuộc gọi chức năng công khai. Ví dụ, ứng dụng sẽ thực hiện cuộc gọi đến App-Sub-System:
class Application
{
private void SomeUpdateFunction()
{
this.textBox1.AppendText(this.AppSubSystem.GetText());
}
}
class AppSubSystem
{
public string GetText()
{
return this.GenericCommsInterface.GetText();
}
}
class GenericCommsInterface
{
public string GetText()
{
string sRetVal = this.sText; // sText is populated by other functions in the class.
this.sText = null; // Suspected race condition is here.
return sRetVal;
}
}
sText
là dân cư không đồng bộ bởi các chức năng khác trong lớp.
Tôi tin rằng tình trạng cuộc đua đang diễn ra giữa string sRetVal = this.sText;
và dòng sau this.sText = null;
.
Ai đó có thể đề xuất một cách để tránh hoặc ngăn chặn tình trạng cuộc đua này? Sẽ sử dụng trợ giúp StringBuilder
hoặc có cách nào khác mà tôi nên thực hiện việc này không?
Rất xấu để 'khóa' vào một đối tượng không được đảm bảo ổn định trong chuỗi truy cập - khóa là 'tư vấn' ở chỗ mọi người đều phải sử dụng/tôn trọng họ. Điều này đặc biệt xấu bởi vì bạn tiếp tục thay đổi đối tượng khóa (bằng cách đặt biến chứa nó thành null). –
Điểm tốt.Một lý do khác để sử dụng một StringBuilder. – cHao
Cảm ơn lời khuyên! Tôi đã thay thế 'private string sText' bằng' private StringBuilder cText' và triển khai các khóa. Nó hoạt động tuyệt vời! Tình trạng chủng tộc đã biến mất. Thanh danh! –