2017-07-03 23 views
12

Đây có thể là một câu hỏi rất ngu ngốc, nhưng tôi có những dòng sau của mã hóa chuyển đổi ảnh RAW để BitmapImages:async công tác vs async trống

public async void CreateImageThumbnails(string imagePath, int imgId) 
{ 
    await Task.Run(() => controlCollection.Where(x => x.ImageId == imgId).FirstOrDefault().ImageSource = ThumbnailCreator.CreateThumbnail(imagePath)); 
} 

trong đó kêu gọi phương pháp này CreateThumbnail()

public static BitmapImage CreateThumbnail(string imagePath) 
{ 
    var bitmap = new BitmapImage(); 

    using (var stream = new FileStream(imagePath, FileMode.Open, FileAccess.Read)) 
    { 
     bitmap.BeginInit(); 
     bitmap.DecodePixelWidth = 283; 
     bitmap.CacheOption = BitmapCacheOption.OnLoad; 
     bitmap.StreamSource = stream; 
     bitmap.EndInit(); 
    } 

    bitmap.Freeze(); 

    GC.WaitForPendingFinalizers(); 
    GC.Collect(); 

    return bitmap; 
} 

Khi sử dụng async Void thay vì async Task trong phương pháp CreateImageThumbnails của tôi, ứng dụng của tôi xử lý hình ảnh (29 trong số đó) khoảng 11 giây nhanh hơn async Task. Tại sao điều này lại là?

async trống async void

async nhiệm vụ async task

Việc sử dụng bộ nhớ nhiều hơn nữa sử dụng void, nhưng các hoạt động được hoàn thành nhiều nhanh hơn. Tôi có ít kiến ​​thức về luồng, đây là lý do tại sao tôi hỏi câu hỏi này. Ai đó có thể vui lòng giải thích tại sao điều này xảy ra?

Ngoài ra tôi đã thực hiện một số nghiên cứu về thời gian và thời điểm không sử dụng async void, nhưng tôi không thể tìm thấy câu trả lời cho câu hỏi của mình. (Tôi có thể không tìm kiếm rất tốt).

Cảm ơn bạn.

+1

Có thể điều này sẽ giúp: https://stackoverflow.com/questions/12144077 –

+0

'async void' là lửa và quên, vì vậy không có gì theo dõi hoạt động không đồng bộ (hoặc thậm chí đảm bảo hoạt động hoàn toàn), trong khi' không đồng bộ Task' thực sự giữ một ca khúc có thể được chờ đợi. – poke

+0

Bạn có đang chờ nhiệm vụ khi đang sử dụng Tác vụ không? – Magnus

Trả lời

6

Khi bạn gọi phương thức async void hoặc gọi phương thức async Task mà không cần chờ, mã của bạn sẽ tiếp tục ngay lập tức mà không cần đợi phương thức thực sự hoàn thành. Điều này có nghĩa rằng một số lời gọi của phương thức có thể thực hiện song song, nhưng bạn sẽ không biết khi nào chúng thực sự hoàn thành, mà bạn thường cần phải biết.

Bạn có thể tận dụng lợi thế của thực hiện song song như thế này, đồng thời cũng có khả năng chờ đợi cho tất cả các lời gọi để hoàn thành bởi lưu trữ các Task s trong một bộ sưu tập và sau đó sử dụng await Task.WhenAll(tasks);.

Cũng nên nhớ rằng nếu bạn muốn thực thi mã song song, bạn phải đảm bảo an toàn để thực hiện điều đó. Điều này thường được gọi là "thread-safety".

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