locked
Можно ли копировать файлы в изолированном хранилище ассинхронно (с применением async, await из Async-CTP-v3)? RRS feed

  • Вопрос

  • Можно ли копировать файлы в изолированном хранилище ассинхронно (с применением async и await из Async-CTP-v3)? А то при копировании большого файла моё приложение приостанавливается.
    29 сентября 2012 г. 19:33

Все ответы

  • Привет.

    Ну саму задачу вы вполне можете попробовать сделать асинхронной. Вы уже пробовали что-нибудь делать?

    Попробуйте вынести код копирования в отдельную функцию, которую объявить как async, а после просто вызывать ее.

    Если не получится - то остаются стандартные методы копирования в бекграунде, использую ThreadPool.


    Для связи [mail]

    2 октября 2012 г. 9:29
  • Код копирования файла:

    public static void CopyFilename(string sourceFilename, string receiverFilename)
    {
        IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication();
        //
        using (Stream input = Application.GetResourceStream(new Uri(sourceFilename, UriKind.Relative)).Stream)
        {
            using (IsolatedStorageFileStream output = iso.CreateFile(receiverFilename))
            {
                byte[] readBuffer = new byte[4096];
                int bytesRead = -1;
                //
                while ((bytesRead = input.Read(readBuffer, 0, readBuffer.Length)) > 0)
                    output.Write(readBuffer, 0, bytesRead);
            }
        }
    }

    Что-то можно с ним сделать?

    2 октября 2012 г. 15:52
  • У меня сейчас SDK не установлен, поэтому проверить не могу, но вроде должен работать вот такой подход:

    public async Task CopyFilenameAsync(string sourceFilename, string receiverFilename)
    {
        await Task.Run(() => CopyFilename(sourceFilename, receiverFilename));
    }
    
    private static void CopyFilename(string sourceFilename, string receiverFilename)
    {
        IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication();
        //
        using (Stream input = Application.GetResourceStream(new Uri(sourceFilename, UriKind.Relative)).Stream)
        {
            using (IsolatedStorageFileStream output = iso.CreateFile(receiverFilename))
            {
                byte[] readBuffer = new byte[4096];
                int bytesRead = -1;
                //
                while ((bytesRead = input.Read(readBuffer, 0, readBuffer.Length)) > 0)
                    output.Write(readBuffer, 0, bytesRead);
            }
        }
    }

    Вызывать можно вот так:

    public async void TestMethod()
    {
        await CopyFilenameAsync("", "");
    }

    2 октября 2012 г. 17:06
    Отвечающий
  • Сделал так, но с изменениями:

    public static async Task CopyFilenameAsync(string sourceFilename, string receiverFilename)
    {
        await TaskEx.Run(() => CopyFilename(sourceFilename, receiverFilename));
    }

    Всё-равно визуально при копировании "toolkit:PerformanceProgressBar" притормаживает.

    4 октября 2012 г. 10:53