Chúng tôi có kịch bản phổ biến này, nơi chúng tôi có một phương pháp thực hiện một số hành động asyncronously và đặt ra một sự kiện khi nó được thực hiện.Có cách nào chung để đồng bộ hóa một phương pháp không đồng bộ không?
Có những lúc mà chúng tôi muốn nó được thực hiện đồng bộ thay vì vậy chúng tôi có mã trông tương tự như sau:
ManualResetEvent reset = new ManualResetEvent(false);
someobject.AsyncActionDone += (sender, args) => reset.Set();
someobject.PerformAsyncAction();
reset.WaitOne();
Có cách nào để viết một phương pháp helper để làm điều này? Tôi có thể vượt qua trong Action để thực hiện, nhưng tôi không chắc chắn làm thế nào để vượt qua một cái gì đó cho phép phương thức trợ giúp biết sự kiện nào để nghe vì nó không giống như bạn có thể truyền vào một EventHandler như một tham số.
Tốt một giải pháp mà không đòi hỏi phản ánh
Dường như có một số nhầm lẫn, đây là một mẫu của những gì SomeObject của lớp cũng giống như:
public class SomeClass
{
private ExternalServer someServerOverTheNetwork = new ExternalServer();
public event EventHandler AsyncActionDone;
public Data SomeData { get; set; }
public void PerformAsyncAction()
{
someServerOverTheNetwork.GetSomeData(OnDataRetrived);
}
public Data OnDataRetrived(Data someData)
{
AsyncActionDone(this, new DataEventArgs(someData));
}
}
Bạn có phải là người triển khai của someobject hoặc là loại thư viện không thể sửa đổi được không? –
Tuy nhiên, có rất nhiều đối tượng như vậy. Hầu hết các hành động liên quan đến việc gửi một yêu cầu đến một máy chủ và chờ kết quả để lấy lại, do đó tại sao chúng không đồng bộ theo mặc định. – Davy8
Chúng ta có một phương pháp để thực hiện điều này cho một trong những hành động phổ biến nhất của chúng ta, lưu trữ một danh sách các đối tượng từ máy chủ, tuy nhiên điều đó phụ thuộc vào việc biết loại đối tượng chính xác và sự kiện cần nghe. Tôi muốn để có thể vượt qua trong đó sự kiện để lắng nghe để chúng tôi có thể làm giảm mã trùng lặp, vì những điều duy nhất khác nhau là phương pháp và sự kiện được nâng lên sau khi hoàn thành. – Davy8