powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отменить копирование (асинх)
16 сообщений из 16, страница 1 из 1
Отменить копирование (асинх)
    #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
Отменить копирование (асинх)
    #39117001
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v skopin,

А поподробней можно? Оригинальный текст ошибки и где жёлтая строка вылезает? А лучше - скриншот.
...
Рейтинг: 0 / 0
Отменить копирование (асинх)
    #39117039
v skopin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
после перестарта всё заработало ОК...
как я понимаю: cancellationToken.ThrowIfCancellationRequested(); это лишнее?
...
Рейтинг: 0 / 0
Отменить копирование (асинх)
    #39117049
v skopin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет: не стабильно, сейчас вылетело:
...
Рейтинг: 0 / 0
Отменить копирование (асинх)
    #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
Отменить копирование (асинх)
    #39117075
v skopin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в 20% случ. вылетает...
...
Рейтинг: 0 / 0
Отменить копирование (асинх)
    #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
Отменить копирование (асинх)
    #39117153
v skopin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получается ни черта...
Писать оно перестаёт, а вот это: destinationStream.Close(); не закрывает...

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

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

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


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