2012-10-01 53 views
6

Trước đó tôi đã đăng this câu hỏi liên quan đến việc áp dụng Async-Await tại khách hàng hoặc tại dịch vụ. Do đọc câu hỏi trước khi đi trước với câu hỏi này vì nó được kết hợp chặt chẽ với câu hỏi.Ưu điểm thực sự của Async-Await?

Dựa trên câu trả lời tôi đã thử nghiệm mã cho C# 4.0 (TPL) và C# 5.0 (Async - Await). Tôi đang gọi dịch vụ bằng cách sử dụng phiên bản async và đồng bộ hóa của phương thức được cung cấp bởi dịch vụ và so sánh số lượng chủ đề được sử dụng trong từng trường hợp. Tiếp theo là mã tôi đang sử dụng để kiểm tra các nguồn lực được sử dụng:

CHỦ PHƯƠNG PHÁP

List<Task<string>> tasksList = new List<Task<string>>(); 
List<int> asyncThreads = new List<int>(); 
List<int> tplThreads = new List<int>(); 
Stopwatch watch = new Stopwatch(); 
watch.Start(); 

// Call the Async version of the method 
for (int i = 0; i < 500; i++) 
{ 
    tasksList.Add(GetNameFromServiceAsync("Input" + i.ToString(), asyncThreads)); 
} 

Task.WaitAll(tasksList.ToArray()); 

watch.Stop(); 

foreach (var item in asyncThreads.Distinct()) 
{ 
    Console.WriteLine(item); 
} 

Console.WriteLine("(C# 5.0)Asynchrony Total Threads = " + asyncThreads.Distinct().Count()); 
Console.WriteLine(watch.ElapsedMilliseconds.ToString()); 

watch.Restart(); 

tasksList.Clear(); 

// Call the normal method 
for (int i = 0; i < 500; i++) 
{ 
    tasksList.Add(GetNameFromService("Input" + i.ToString(), tplThreads)); 
} 

Task.WaitAll(tasksList.ToArray()); 

watch.Stop(); 

foreach (var item in tplThreads.Distinct()) 
{ 
    Console.WriteLine(item); 
} 

Console.WriteLine("(C# 4.0)TPL Total Threads" + tplThreads.Distinct().Count()); 

Console.WriteLine(watch.ElapsedMilliseconds.ToString()); 

Async và Sync cuộc gọi đến các dịch vụ

static async Task<string> GetNameFromServiceAsync(string name, List<int> threads) 
{ 
    Console.WriteLine(" Start Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId); 
    var task = await client.GetNameAsync(name); 
    threads.Add(System.Threading.Thread.CurrentThread.ManagedThreadId); 
    // Console.WriteLine("End GetNameFromServiceAsync Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId); 
    return task; 
} 

static Task<string> GetNameFromService(string name, List<int> threads) 
{ 

    var task = Task<string>.Factory.StartNew(() => 
     { 
      threads.Add(System.Threading.Thread.CurrentThread.ManagedThreadId); 
     // Console.WriteLine("GetNameFromService Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId); 
      return client.GetName(name); 
     }); 

    return task; 
} 

Bây giờ tôi đã đã làm việc trên câu trả lời và tìm ra các kết quả sau:

  • Nếu tôi thực hiện 500 cuộc gọi đến dịch vụ, nó chỉ sử dụng 4-5 luồng.
  • Cuộc gọi TPL tạo khoảng 44-45 chủ đề.
  • Thời gian cho cuộc gọi không đồng bộ là khoảng 17 - 18 giây
  • Thời gian cho cuộc gọi TPL là khoảng 42 - 45 giây.

Tôi muốn có một số phản hồi về những phát hiện của mình để nó có thể hữu ích cho các thành viên khác trong cộng đồng. Có câu trả lời cho câu hỏi trước của tôi không ??

EDIT

Q. Quan sát của tôi kết luận rằng nếu chúng tôi sử dụng async-chờ đợi thay vì Task.Factory.startNew TPL, sau đó nó sẽ tiêu thụ ít đề. LÀM THẾ NÀO ĐÚNG NÀY? NẾU KHÔNG, NHỮNG QUYỀN TRỰC TIẾP GÌ ĐẾN VỚI SOCH SO SÁNH LÀ GÌ?

Q. Vì tôi đang học không đồng bộ - đang chờ đợi, tôi muốn chứng minh giá trị của nó bằng một số loại so sánh và mã rắn.

+8

Câu hỏi của bạn chính xác là gì? –

+0

Bằng cách sử dụng async - chờ chúng tôi có thể nhận được lợi thế bộ nhớ (tài nguyên ít hơn sẽ được sử dụng). Đây là những gì tôi nhận được từ câu hỏi trước đó của tôi hoặc những gì tôi hiểu và tôi muốn biết là câu trả lời của nó. Tôi muốn hỏi trong bối cảnh lợi thế khả năng mở rộng bằng cách sử dụng async-await. Nó có phù hợp với những gì tôi đã kết luận không? –

+0

Một lợi thế quan trọng và rõ ràng là Người dùng không thể nói họ gặp phải sự cố không đồng bộ khi họ đã thực hiện mã đồng bộ. –

Trả lời

12

Phía máy khách async (so với mã đồng bộ) thường cải thiện khả năng phản hồi với chi phí chi phí bộ nhớ thấp.

Phía máy chủ async (so với mã đồng bộ) thường cải thiện khả năng mở rộng bằng cách giảm mức sử dụng bộ nhớ/luồng. Những lợi thế này cũng áp dụng cho phía máy khách async (so với mã đa luồng).

Cả hai đều là khái quát hóa cực đoan và chắc chắn có những trường hợp chúng sai.

Cập nhật:

quan sát của tôi kết luận rằng nếu chúng tôi sử dụng async-chờ đợi ..., sau đó nó sẽ tiêu thụ ít đề.

async/await bật mã không đồng bộ có thể duy trì. Bởi bản thân họ, họ không có bất cứ điều gì để làm với việc tạo ra các chủ đề.Tuy nhiên, chúng thường được sử dụng với Task.Run (hoặc Task.Factory.StartNew) để tạo các tác vụ nền.

Vì tôi đang học không đồng bộ - đang chờ đợi, tôi muốn chứng minh giá trị của nó bằng một số loại so sánh và mã rắn.

asyncawait là các phép biến đổi trình biên dịch. Họ làm cho nó dễ dàng hơn để viết các chương trình không đồng bộ - đó là tất cả.

Nếu bạn so sánh chúng với mã đồng bộ, thì bạn thường sẽ thấy khả năng phản hồi và/hoặc khả năng mở rộng được cải thiện. Nếu bạn so sánh chúng với mã không đồng bộ hiện tại, thì chúng thường sẽ là hơi kém hiệu quả hơn nhưng bù đắp cho việc bảo trì mã.

+0

Cảm ơn stephen. Tôi đã cập nhật câu hỏi của mình. –

+0

Đã cập nhật câu trả lời. –

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