2009-11-23 42 views
39

Tôi nghe nói rằng có bốn mẫu trong thực thi không đồng bộ.C# -Các mẫu trong thực thi không đồng bộ

"Có bốn mẫu trong thực hiện đại diện async: Polling, chờ hoàn thành, thông báo hoàn thành, và " Fire và Forget"

Khi tôi có đoạn mã sau:

class AsynchronousDemo 
{ 
    public static int numberofFeets = 0; 
    public delegate long StatisticalData(); 

    static void Main() 
    { 
     StatisticalData data = ClimbSmallHill; 
     IAsyncResult ar = data.BeginInvoke(null, null); 
     while (!ar.IsCompleted) 
     { 
      Console.WriteLine("...Climbing yet to be completed....."); 
      Thread.Sleep(200); 

     } 
     Console.WriteLine("..Climbing is completed..."); 
     Console.WriteLine("... Time Taken for climbing ....{0}", 
     data.EndInvoke(ar).ToString()+"..Seconds"); 
     Console.ReadKey(true); 

    } 


    static long ClimbSmallHill() 
    { 
     var sw = Stopwatch.StartNew(); 
     while (numberofFeets <= 10000) 
     { 
      numberofFeets = numberofFeets + 100; 
      Thread.Sleep(10); 
     } 
     sw.Stop(); 
     return sw.ElapsedMilliseconds; 
    } 
} 

1) Mẫu mã trên được triển khai như thế nào?

2) Bạn có thể giải thích mã không, làm cách nào tôi có thể thực hiện phần còn lại ..?

+18

Tôi ước gì mình có Stack Overflow để làm bài tập về nhà Khoa học Máy tính của mình cho tôi khi tôi ở Đại học ...:) –

Trả lời

87

Những gì bạn có ở đó là mẫu Polling. Trong mô hình này, bạn liên tục hỏi "Chúng ta có ở đó chưa?" Vòng lặp while đang thực hiện chặn. Các Thread.Sleep ngăn cản quá trình từ ăn chu kỳ CPU.


Đợi hoàn thành là phương pháp "Tôi sẽ gọi cho bạn".

IAsyncResult ar = data.BeginInvoke(null, null); 
//wait until processing is done with WaitOne 
//you can do other actions before this if needed 
ar.AsyncWaitHandle.WaitOne(); 
Console.WriteLine("..Climbing is completed..."); 

Vì vậy, ngay sau khi WaitOne được gọi là bạn đang chặn cho đến khi leo núi hoàn tất. Bạn có thể thực hiện các tác vụ khác trước khi chặn.


Thông báo hoàn thành bạn đang nói "Bạn gọi cho tôi, tôi sẽ không gọi cho bạn".

IAsyncResult ar = data.BeginInvoke(Callback, null); 

//Automatically gets called after climbing is complete because we specified this 
//in the call to BeginInvoke 
public static void Callback(IAsyncResult result) { 
    Console.WriteLine("..Climbing is completed..."); 
} 

Không có chặn nào ở đây vì Callback sẽ được thông báo.


Và lửa và quên sẽ là

data.BeginInvoke(null, null); 
//don't care about result 

Ngoài ra còn có không chặn ở đây vì bạn không quan tâm khi leo xong. Như tên cho thấy, bạn quên nó đi. Bạn đang nói "Đừng gọi tôi, tôi sẽ không gọi cho bạn, nhưng vẫn không gọi cho tôi."

+0

+1 Đánh tôi với nó. –

+1

Nếu bạn không nhớ, bạn có thể so sánh các mẫu đó về mức tiêu thụ thời gian không? – user215675

+1

Ý của bạn là gì về thời gian tiêu thụ? – Bob

0

Mã này là Polling:

while (!ar.IsCompleted) 

Đó là chìa khóa, bạn tiếp tục kiểm tra hay không nó hoàn thành.

Mã này không thực sự hỗ trợ cả bốn, nhưng một số mã thì có.

Process fileProcess = new Process(); 
// Fill the start info 
bool started = fileProcess.Start(); 

Phương thức "Bắt đầu" không đồng bộ. Nó tạo ra một quy trình mới.

Chúng ta có thể làm mỗi trong những cách bạn yêu cầu với mã này:

// Fire and forget 
// We don't do anything, because we've started the process, and we don't care about it 

// Completion Notification 
fileProcess.Exited += new EventHandler(fileProcess_Exited); 

// Polling 
while (fileProcess.HasExited) 
{ 

} 

// Wait for completion 
fileProcess.WaitForExit(); 
2
while (!ar.IsCompleted) 
{ 
    Console.WriteLine("...Climbing yet to be completed....."); 
    Thread.Sleep(200); 
} 

Đó là bỏ phiếu cổ điển. - Kiểm tra, ngủ, kiểm tra lại,

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