Асинхронная Копия/Перемещение Файла в [закрытом] C#

or имеет более низкое приоритет оператора , чем and, таким образом y < z or z > y and y > z or z < y эквивалентно (y < z) or (z > y and y > z) or (z < y), и так как y < z True, все выражение поэтому True после оценки эти or операции.

63
задан user95883 19 May 2009 в 13:14
поделиться

3 ответа

Вы можете использовать асинхронные делегаты

public class AsyncFileCopier
    {
        public delegate void FileCopyDelegate(string sourceFile, string destFile);

        public static void AsynFileCopy(string sourceFile, string destFile)
        {
            FileCopyDelegate del = new FileCopyDelegate(FileCopy);
            IAsyncResult result = del.BeginInvoke(sourceFile, destFile, CallBackAfterFileCopied, null);
        }

        public static void FileCopy(string sourceFile, string destFile)
        { 
            // Code to copy the file
        }

        public static void CallBackAfterFileCopied(IAsyncResult result)
        {
            // Code to be run after file copy is done
        }
    }

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

AsyncFileCopier.AsynFileCopy("abc.txt", "xyz.txt");

Эта ссылка расскажет вам о различных методах асинхронного кодирования

6
ответ дан 24 November 2019 в 16:24
поделиться

Вы можете сделать это, как эта статья предлагает:

public static void CopyStreamToStream(
    Stream source, Stream destination,
    Action<Stream, Stream, Exception> completed)
    {
        byte[] buffer = new byte[0x1000];
        AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(null);

        Action<Exception> done = e =>
        {
            if(completed != null) asyncOp.Post(delegate
                {
                    completed(source, destination, e);
                }, null);
        };

        AsyncCallback rc = null;
        rc = readResult =>
        {
            try
            {
                int read = source.EndRead(readResult);
                if(read > 0)
                {
                    destination.BeginWrite(buffer, 0, read, writeResult =>
                    {
                        try
                        {
                            destination.EndWrite(writeResult);
                            source.BeginRead(
                                buffer, 0, buffer.Length, rc, null);
                        }
                        catch(Exception exc) { done(exc); }
                    }, null);
                }
                else done(null);
            }
            catch(Exception exc) { done(exc); }
        };

        source.BeginRead(buffer, 0, buffer.Length, rc, null);
5
ответ дан 24 November 2019 в 16:24
поделиться

Правильный способ копирования: используйте отдельный поток.

Вот как вы можете это сделать (синхронно):

//.. [code]
doFileCopy();
// .. [more code]

Вот как это сделать асинхронно:

// .. [code]
new System.Threading.Thread(doFileCopy).Start();
// .. [more code]

Это очень наивный способ делать вещи. Если все сделано правильно, решение будет включать в себя некоторый метод события / делегата для сообщения о состоянии копии файла и уведомления о важных событиях, таких как сбой, завершение и т. Д.

Ура, младший

-2
ответ дан 24 November 2019 в 16:24
поделиться
Другие вопросы по тегам:

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