Ponieważ muszę wykonać wiele operacji we/wy plików w mojej aplikacji, Postanowiłem zaimplementować je asynchronicznie. Patrząc na MSDN, nie ma asynchronicznych odpowiedników dla File.Create, File.Delete i File.Move. Jak dowiedziałem się, powodem jest nieistnienie asynchronicznego realizacji Win32 dla pliku usuwać, tworzyć lub przenieść, więc skończyło się następujące rozwiązanie:Jak zaimplementować plik 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); });
}
Uwzględniając Paradigma "Don’t use Task.Run in Libraries", zastanawiam się, czy istnieje lepsza implementacja czy powinienem zrezygnować z kodu synchronicznego?
Wielkie dzięki z góry!
Edits:
- Poprawiono kod na podstawie Peter Duniho zalecenia
- dodał link do oryginalnego blogu dostarczonych przez Sriram Sakthivel
Kto mówi "nie używaj' Task.Run() 'w bibliotekach"? Jak myślisz, w jaki sposób możesz wykonywać synchroniczne metody bez użycia tego lub czegoś podobnego? Czy jest coś nie w porządku z wdrożeniem, które masz? –
@PeterDuniho Rekomendacja Stephen cleary. On zaleca, aby nie używać 'Task.Run' w implementacji, jeśli chcesz zawinąć synchroniczną metodę jako operację asynchroniczną, zrób to w kodzie klienta tam, gdzie jest to potrzebne.Edycja: Stephen Toub mówi również, że nie naraża asynchronicznego opakowania na metody synchroniczne. –
Nawiasem mówiąc, twoje implementacje wydają się mniej niż doskonałe. Wszystkie metody powinny po prostu zwrócić 'Task' (bez konfiguracji oczekującej i bez metod' async'). 'CreateAsync()' może 'zwrócić Task.Run (() => File.Create (path));' (tzn. Zwrócone zadanie zwróciło samo obiekt 'FileStream' ... nie ma potrzeby czekania na siebie, aby to zrobić ani używać przechwytywania zmiennych w celu jego wykonania). –