Vì tôi phải thực hiện rất nhiều thao tác nhập/xuất tệp trong ứng dụng của mình, Tôi đã quyết định triển khai chúng không đồng bộ. Nhìn vào MSDN, không có đối tác không đồng bộ cho File.Create, File.Delete và File.Move. Như tôi đã học được, lý do là không tồn tại của một thực hiện Win32 không đồng bộ cho file xóa, tạo hoặc di chuyển, Vì vậy, tôi đã kết thúc với các giải pháp sau đây:Làm cách nào để triển khai tệp async.Delete/Create/Move?
public static Task DeleteAsync(string path)
{
Guard.FileExists(path);
return Task.Run(() => File.Delete(path));
}
public static Task<FileStream> CreateAsync(string path)
{
Guard.IsNotNullOrWhitespace(path);
return Task.Run(() => File.Create(path));
}
public static Task MoveAsync(string sourceFileName, string destFileName)
{
Guard.FileExists(sourceFileName);
Guard.IsNotNullOrWhitespace(destFileName);
return Task.Run(() => { File.Move(sourceFileName, destFileName); });
}
Xét Paradigma "Don’t use Task.Run in Libraries", tôi tự hỏi nếu có một thực hiện tốt hơn hay tôi nên dự phòng mã đồng bộ?
Rất cám ơn trước!
Chỉnh sửa:
- Cải thiện mã dựa trên Peter Duniho khuyến nghị
- gia tăng liên kết đến bài đăng blog ban đầu được cung cấp bởi Sriram Sakthivel
Ai nói "không sử dụng' Task.Run() 'trong thư viện"? Làm thế nào để bạn nghĩ rằng bạn có thể thực hiện các phương thức đồng bộ mà không sử dụng một trong hai điều đó, hoặc một cái gì đó tương đương với điều đó? Có bất cứ điều gì thực sự sai với việc thực hiện bạn có? –
@PeterDuniho Đó là khuyến cáo của stepy cleary. Ông khuyên bạn không nên sử dụng 'Task.Run' khi triển khai thực hiện, nếu bạn cần bọc phương thức đồng bộ là hoạt động không đồng bộ, sau đó thực hiện nó trong mã máy khách mà bạn cần nó.Chỉnh sửa: Ngoài ra Stephen toub nói rằng không phơi bày wrapper không đồng bộ trên các phương thức đồng bộ. –
Nhân tiện, việc triển khai của bạn dường như không hoàn hảo. Các phương thức nên tất cả chỉ trả về 'Task' (không cấu hình chờ đợi, và không có các phương thức là 'async'). 'CreateAsync()' có thể trả về Task.Run (() => File.Create (path)); '(nghĩa là nhiệm vụ awaitable trả lại sẽ tự trả về đối tượng' FileStream' ... không cần phải chờ đợi để làm điều đó và cũng không sử dụng tính năng ghi biến để hoàn thành nó). –