Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отменить копирование (асинх) / 16 сообщений из 16, страница 1 из 1
01.12.2015, 09:48
    #39116989
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
Привет всем!

Что-то туплю или с отменой не лады какие-то:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
                using (FileStream destinationStream = File.Create(file))
                {
                    try
                    {
                        while ((numRead = await streams[ind].ReadAsync(buffer, 0, buffer.Length)) != 0)
                        {
                            currentFileInd = ind;
                            await destinationStream.WriteAsync(buffer, 0, numRead, cancellationToken);
                            setProgress(Infos.GetProgress(ind, destinationStream.Length));
                            cancellationToken.ThrowIfCancellationRequested();
                        }
                    }
                    catch (OperationCanceledException)
                    {
                        destinationStream.Close();
                        streams[ind].Close();
                    }
                }

При отмене удаляю уже готовые файлы, но возникает исключение: обязательно последний занят другим процессом(((
Что тут не так?

Заранее благодарю ВС
...
Рейтинг: 0 / 0
01.12.2015, 10:01
    #39117001
MrVoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
v skopin,

А поподробней можно? Оригинальный текст ошибки и где жёлтая строка вылезает? А лучше - скриншот.
...
Рейтинг: 0 / 0
01.12.2015, 10:28
    #39117039
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
после перестарта всё заработало ОК...
как я понимаю: cancellationToken.ThrowIfCancellationRequested(); это лишнее?
...
Рейтинг: 0 / 0
01.12.2015, 10:38
    #39117049
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
Хотя нет: не стабильно, сейчас вылетело:
...
Рейтинг: 0 / 0
01.12.2015, 10:55
    #39117073
MrVoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
v skopin,

авторCreating a Task that you can cancel is a four-step process:

1. Create a new instance of System.Threading.CancellationTokenSource:
CancellationTokenSource tokenSource = new CancellationTokenSource

2. Call the CancellationTokenSource.Token property to get a System.Threading.CancellationToken:
CancellationToken token = tokenSource.Token;

3. Create a new Task or Task<T> using an Action or Action<object> delegate and the CancellationToken from step 2 as constructor arguments:
Task task1 = new Task(new Action(myMethod), token);

4. Call the Start() method on your Task or Task<T> as you would normally.

To cancel a Task, simply call the Cancel() method on the CancellationTokenSource created in step 1.
Task cancellation is cooperative, which means that the .NET Framework doesn’t force your tasks to finish; you have to monitor the CancellationToken you used to create your task and stop your task when you detect that a cancellation has been requested. Passing the cancellation token to the Task constructor allows the .NET Framework to avoid starting tasks that rely on tokens that have already been cancelled.
...
Рейтинг: 0 / 0
01.12.2015, 10:56
    #39117075
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
в 20% случ. вылетает...
...
Рейтинг: 0 / 0
01.12.2015, 10:58
    #39117080
MrVoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
v skopin,

авторYou must also throw an instance of System.Threading.OperationCanceledException in your task
body; this is how you acknowledge the cancellation, and if you forget, the status of your task will not be
set correctly. The following code fragment shows the basic anatomy of a task body loop that polls for
cancellation:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
while (true) {
    if (token.IsCancellationRequested) {
        // tidy up and release resources
        throw new OperationCanceledException(token);
    } else {
    // do a unit of work
    }
}



If you don’t have any resources to release, you can simplify your code by calling the
CancellationToken.ThrowIfCancellationRequested() method, which will perform the cancellation check
and throw the exception in one step. This changes the loop anatomy as follows:
Код: c#
1.
2.
3.
4.
while (true) {
    token.ThrowIfCancellationRequested();
    // do a unit of work
    }
...
Рейтинг: 0 / 0
01.12.2015, 11:53
    #39117153
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
Не получается ни черта...
Писать оно перестаёт, а вот это: destinationStream.Close(); не закрывает...

все варианты опробовал(((
...
Рейтинг: 0 / 0
01.12.2015, 12:03
    #39117169
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
ИМХУ попробуй паузу сделать.
То что ты остановил запись и закрыл файл не значит что файл тут же закрылся. Там же еще кэш виндовса учавствует, транзакции ФС и т.д. это тоже должно успеть доработать.
...
Рейтинг: 0 / 0
01.12.2015, 12:16
    #39117187
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
Просто тупо закрывается поток очень долго, синхронизация тут не при чём...
...
Рейтинг: 0 / 0
01.12.2015, 12:23
    #39117203
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
опять туплю, а как понять, что поток закрыт?
...
Рейтинг: 0 / 0
01.12.2015, 14:14
    #39117351
MrVoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
v skopin,

NULL?
...
Рейтинг: 0 / 0
01.12.2015, 19:23
    #39117747
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
MrVoidNULL?нет(((
...
Рейтинг: 0 / 0
01.12.2015, 19:26
    #39117748
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
...
Рейтинг: 0 / 0
02.12.2015, 13:40
    #39118346
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
buser,

есть там получше вариант: SafeFileHandle.IsClosed
НО, теряется идея асинхронности
...
Рейтинг: 0 / 0
02.12.2015, 22:15
    #39118822
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отменить копирование (асинх)
в общем, надоело.
Если кому надо на будущее:
Код: c#
1.
2.
3.
4.
5.
6.
7.
                        file.SetLength(0);
                        Proc.Sleep(); /*из треад*/ 
                        Proc.FreeLibrary(file.Handle);  /*из кернела32*/ 
                        file.Close();
                        Proc.Sleep(99);
                        file.Dispose();
                        Proc.Sleep(99);

лучше не выйдет, много проб всяких было
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отменить копирование (асинх) / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]