2013-03-27 44 views
11

Tôi không quen với việc sử dụng ManualResetEvent?Về việc sử dụng sử dụng ManualResetEvent C#?

có liên quan đến chủ đề. những gì nó làm và khi nó được sử dụng?

ở đây tôi nhận được mã nơi ManualResetEvent được sử dụng nhưng tôi chỉ không hiểu nó làm gì?

đây là mã

public class Doc : SomeInterfaceFromTheDll 
{ 
    private readonly IVersion version; // An interface from the DLL. 
    private readonly ManualResetEvent _complete = new ManualResetEvent(false); 

    private bool downloadSuccessful; 

    // ... 

    public bool Download() 
    { 
    this.version.DownloadFile(this); 
    // Wait for the event to be signalled... 
    _complete.WaitOne(); 
    return this.downloadSuccessful; 
    } 

    public void Completed(short reason) 
    { 
    Trace.WriteLine(string.Format("Notify.Completed({0})", reason)); 
    this.downloadSuccessful = reason == 0; 
    // Signal that the download is complete 
    _complete.Set(); 
    } 

    // ... 
} 

ý nghĩa của _complete.WaitOne(); & _complete.Set(); ?

bất cứ ai có thể cho tôi mẫu mã nhỏ, nơi ManualResetEvent sử dụng lớp sẽ có mặt ở đó là gì.

tìm kiếm thảo luận và sử dụng tốt của ManualResetEvent? cảm ơn

Trả lời

16

Tôi khuyên bạn nên đọc phần "nhận xét" của số MSDN page of ManualResetEvent, điều này khá rõ ràng về việc sử dụng lớp này.

Để trả lời câu hỏi cụ thể của bạn, ManualResetEvent được sử dụng để mô phỏng cuộc gọi đồng bộ đến Download ngay cả khi nó không đồng bộ. Nó gọi phương thức async và chặn cho đến khi ManualResetEvent được báo hiệu. ManualResetEvent được báo hiệu trong trình xử lý sự kiện của mẫu dựa trên sự kiện async. Vì vậy, về cơ bản nó chờ đợi cho đến khi sự kiện này được kích hoạt và xử lý sự kiện được thực hiện.

2

ManualSetEvent là lớp giúp bạn quản lý giao tiếp giữa các luồng khác nhau khi một số luồng phải dừng lại và đợi để hoàn tất một chuỗi khác (chủ đề) thì lớp đó rất hữu ích.

2

Để đạt được sự hiểu biết sâu sắc về bất kỳ chủ đề nào, tôi phải đọc thông tin gần như giống nhau nói cách khác. Tôi đã đọc các tài liệu MSDN về ManualResetEvent, nó là tốt Tôi gần như đã hiểu nó, nhưng liên kết này đã giúp tôi hiểu nó tốt:

http://dotnetpattern.com/threading-manualresetevent


RẤT Giải thích đơn giản

Nếu chủ đề hiện tại gọi phương thức WiatOne(), nó sẽ chờ (vì vậy hãy ngừng làm bất kỳ điều gì) cho đến khi bất kỳ chủ đề nào khác gọi phương thức Đặt().

Có quá tải khác cho WaitOne, là WaitOne (TimeSpan). Điều này gần như giống như ở trên, nhưng nếu cho eaxample cung cấp cho 5 giây thời gian cho phương pháp này, luồng hiện tại sẽ chờ cho các chủ đề khác gọi phương thức Đặt() cho 5 giây và nếu không một gọi là Đặt(), nó gọi nó là tự động và contunie công việc.

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