Есть ли асинхронная версия DirectoryInfo. GetFiles / Каталог. GetDirectories в dotNet?

Я переставил коды:

using System;

namespace sodacrate
{
    public class Sodacrate
    {
        private string[] flaskor = new string[24];
        private int antal_flaskor = 0;
        public int sum = 0;

        public void Run()
        {
            Console.WriteLine("|*|Välkommen till läskbacken!|*|");

            int temp = 0;
            do
            {
                Console.WriteLine("|*|Välj ett alternativ|*|");
                Console.WriteLine("/~*/~*/~*/~*/~*/~*/~*/~*/~*/~*/~*/~*/~*/~*/");
                Console.WriteLine("(1): Lägg till en läsk");
                Console.WriteLine("(2): Skriv ut innehållet i läskbacken");
                Console.WriteLine("(3): Beräkna totala värdet på läskbacken");
                Console.WriteLine("(4): Avsluta programmet");

                temp = int.Parse(Console.ReadLine());
                switch (temp)
                {
                    case 1:
                        add_soda();
                        break;
                    case 2:
                        print_crate();
                        break;
                    case 3:
                        calc_total();
                        break;
                    case 4:
                        Console.WriteLine("Programmet avslutas...");
                        break;
                    default:
                        Console.WriteLine("Ogiltig inmatning");
                        break;
                }
            } while (temp != 0);
        }

        public void add_soda()
        {
            if (antal_flaskor == 24)
            {
                Console.WriteLine("Läskbacken är full, du kan inte lägga till fler flaskor!");
                return;
            }

            Console.WriteLine("    |*|*|~MENY~|*|*|");
            Console.WriteLine("    Välj valfri läsk");
            Console.WriteLine("/------------------/");
            Console.WriteLine("(1): Coca-Cola   5kr");
            Console.WriteLine("(2): Fanta       5kr");
            Console.WriteLine("(3): Sprite      5kr");
            Console.WriteLine("(4): Pepsi       5kr");
            Console.WriteLine("(5): Trocadero   5kr");
            Console.WriteLine("/------------------/");

            int temp = int.Parse(Console.ReadLine());
            bool meny = true;

            do
            {
                switch (temp)
                {
                    case 1:
                        Console.WriteLine("Coca-Cola");
                        meny = false;
                        break;
                    case 2:
                        Console.WriteLine("Fanta");
                        meny = false;
                        break;
                    case 3:
                        Console.WriteLine("Sprite");
                        meny = false;
                        break;
                    case 4:
                        Console.WriteLine("Pepsi");
                        meny = false;
                        break;
                    case 5:
                        Console.WriteLine("Trocadero");
                        meny = false;
                        break;
                    default:
                        Console.WriteLine("Ogiltig inmatning");
                        meny = false;
                        break;
                }
            } while (meny);
            Console.WriteLine("Tryck för att återgå till menyn...");
        }

        public void print_crate()
        {
            foreach (var dryck in flaskor)
            {
                if (dryck != null)
                    Console.WriteLine(dryck);
                else
                    Console.WriteLine("Ledig");
            }
        }

        public int calc_total()
        {
            int total = 0;

            foreach (var dryck in flaskor)
            {
                if (dryck != null)
                    total += 5;
            }
            return total;
        }

    }
}



class Program
{
    public static void Main(string[] args)
    {
        var sodacrate = new sodacrate.Sodacrate();
        sodacrate.Run();
        Console.Write("Press any key to continue . . . ");
        Console.ReadKey(true);
    }
}
40
задан Noldorin 5 April 2009 в 15:11
поделиться

5 ответов

Нет, я не думаю, что существует. Подход потока пула является, вероятно, самым прагматичным. С другой стороны, я предполагаю, что Вы могли выпадающий к P/Invoke - но это будет намного большим количеством работы.

11
ответ дан Marc Gravell 27 November 2019 в 01:55
поделиться

Я не нашел асинхронную версию GetFiles, однако если Вы смотрите на исходный код для других Асинхронных операций, они определяются следующим образом:

module FileExtensions =

        let UnblockViaNewThread f =
            async { //let ctxt = System.Threading.SynchronizationContext.Current
                    do! Async.SwitchToNewThread ()
                    let res = f()
                    do! Async.SwitchToThreadPool ()
                    //do! Async.SwitchTo ctxt
                    return res }

        type System.IO.File with
            static member AsyncOpenText(path)   = UnblockViaNewThread (fun () -> System.IO.File.OpenText(path))
            static member AsyncAppendText(path) = UnblockViaNewThread (fun () -> System.IO.File.AppendText(path))
            static member AsyncOpenRead(path)   = UnblockViaNewThread (fun () -> System.IO.File.OpenRead(path))
            static member AsyncOpenWrite(path)  = UnblockViaNewThread (fun () -> System.IO.File.OpenWrite(path))
            static member AsyncOpen(path,mode,?access,?share) =
                let access = match access with Some v -> v | None -> System.IO.FileAccess.ReadWrite
                let share = match share with Some v -> v | None -> System.IO.FileShare.None
                UnblockViaNewThread (fun () -> System.IO.File.Open(path,mode,access,share))

            static member OpenTextAsync(path)   = System.IO.File.AsyncOpenText(path)
            static member AppendTextAsync(path) = System.IO.File.AsyncAppendText(path)
            static member OpenReadAsync(path)   = System.IO.File.AsyncOpenRead(path)
            static member OpenWriteAsync(path)  = System.IO.File.AsyncOpenWrite(path)
            static member OpenAsync(path,mode,?access,?share) = System.IO.File.AsyncOpen(path, mode, ?access=access, ?share=share)

Другими словами, Асинхронный файл, streamreader, и операции WebClient являются просто обертками вокруг синхронных операций, таким образом, необходимо смочь записать собственную обертку вокруг GetFiles/GetDirectories следующим образом:

module IOExtensions =
    type System.IO.Directory with
        static member AsyncGetFiles(directory) = async { return System.IO.Directory.GetFiles(directory) }
        static member AsyncGetDirectories(path) = async { return System.IO.Directory.GetDirectories(path) }
13
ответ дан Juliet 27 November 2019 в 01:55
поделиться

Я несколько раз использовал этот подход для получения Асинхронных объектов от функций/процедур, и он всегда работал отлично:


let AsyncGetDirectories path = 
    let fn = new Func<_, _>(System.IO.Directory.GetDirectories)
    Async.BuildPrimitive(path, fn.BeginInvoke, fn.EndInvoke)
3
ответ дан em70 27 November 2019 в 01:55
поделиться
1
ответ дан Brian 27 November 2019 в 01:55
поделиться

Ответ принцессы является способом пойти для добавления гранулярности между задачами - таким образом, такого рода вещь позволила бы другим плеерам использовать пул потоков:

let! x = OpenTextAsync("whatever");
// opening for something else to run
let! x = OpenTextAsync("whatever");
// opening for something else to run
let! x = OpenTextAsync("whatever");

Не помогает столько же, когда каждый из тех, которые блокируют вызовы, тяжел - и GetFiles по SMB является в значительной степени определением тяжелых.

Я надеялся, что был своего рода эквивалент для BeginRead/EndRead для каталогов и этого GetFiles/GetDirectories была просто хорошая обертка вокруг вызовов низшего уровня, которые выставили некоторые асинхронные варианты. Что-то как BeginReadDir/EndReadDir.

0
ответ дан bobbymcr 27 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: