Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Всё таки можно как-то грохнуть Thread/Task без отмены? / 18 сообщений из 18, страница 1 из 1
25.05.2021, 11:45
    #40072674
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
Привет всем!

Собственно вопрос в сабже. вопрос возник от сюда
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
            var escape = new Thread(() =>
            {
                while (IsNotCancelled && !test.IsCompleted)
                {
                    if (ReadKey().Key == ConsoleKey.Escape)
                        _cancelSource.Cancel();
                    Write("\b");
                }
            });


Но вообще, стало просто интересно как это возможно...

Заранее благодарю

ЗЫ
escape.Abort() - не просто устарел в .NET 5, а ошибку генерирует
...
Рейтинг: 0 / 0
25.05.2021, 12:07
    #40072684
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
а еще можно на велеке тормозить засовывая ногу в спицы переднего колеса перед вилкой
...
Рейтинг: 0 / 0
25.05.2021, 12:33
    #40072701
fkfka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
Ты что в итоге сделать-то хочешь? По коду у меня практически уверенность, что ты пытаешься забить гвоздь отверткой.
...
Рейтинг: 0 / 0
25.05.2021, 12:43
    #40072702
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
fkfka
Ты что в итоге сделать-то хочешь? По коду у меня практически уверенность, что ты пытаешься забить гвоздь отверткой.
Ecли пользователь не нажал, а другая задача завершилась(test.IsCompleted), то остановить ожидание ReadKey()
...
Рейтинг: 0 / 0
25.05.2021, 13:29
    #40072726
fkfka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
v skopin,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
using System;
using System.Threading;
using System.Threading.Tasks;

using CancellationTokenSource cancellationTokenSource = new();

Console.CancelKeyPress += (_, e) => {
    cancellationTokenSource.Cancel();
    e.Cancel = true;
};

try
{
    Console.WriteLine("Press Ctl-C to terminate.");
    await VeryLongTask(cancellationTokenSource.Token);
}
catch (OperationCanceledException)
{
    Console.WriteLine();
    Console.WriteLine("Boo! Operation cancelled!");
}

async Task VeryLongTask(CancellationToken cancellationToken)
{
    Console.WriteLine("Starting a very long operation.");

    while (true)
    {
        cancellationToken.ThrowIfCancellationRequested();
        Console.Write(".");
        await Task.Delay(TimeSpan.FromSeconds(1));
    }
}



Идея понятна?
...
Рейтинг: 0 / 0
26.05.2021, 10:30
    #40073012
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
fkfka,
Спасибо)
-мой вар-нт сильно хуже)))

Но а всё таки(по теме), хочу грохнуть Task, как?
(допустим, закзчику не понравилось котрол-С)

или (не мой в-нт) зависло всё, а таймаута нет...
...
Рейтинг: 0 / 0
26.05.2021, 12:33
    #40073077
fkfka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
v skopin
Но а всё таки(по теме), хочу грохнуть Task, как?

В случае ReadKey ответ - никак. Это операция, которая намертво блокирует поток и прервать ее можно только грохнув сам поток, что ныне уже невозможно.

Можно просто забить на этот поток - он сам грохнется при выходе. Например так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
using System;
using System.Threading;
using System.Threading.Tasks;

using CancellationTokenSource cancellationTokenSource = new();
Console.WriteLine("Press any key to terminate.");

// "Start" tasks
var readAnyKey = ReadAnyKey();
var longOperation = VeryLongTask(cancellationTokenSource.Token);

// Wait for any task to finish
var finished = await Task.WhenAny(readAnyKey, longOperation);

// A key's been pressed
if (finished == readAnyKey)
{
    // causes cancelling the other task
    cancellationTokenSource.Cancel();

    // just wait for another task to be cancelled
    try
    {
        await longOperation;
    }
    catch (OperationCanceledException)
    {
        Console.WriteLine();
        Console.WriteLine("Boo! Operation cancelled!");
    }
}

// This task is completed as soon as any key is pressed
Task ReadAnyKey() => Task.Run(() => Console.ReadKey(true));

// Some long operation
async Task VeryLongTask(CancellationToken cancellationToken)
{
    Console.WriteLine("Starting a very long operation.");

    while (true)
    {
        cancellationToken.ThrowIfCancellationRequested();
        Console.Write(".");
        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
    }
}
...
Рейтинг: 0 / 0
26.05.2021, 12:58
    #40073094
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
v skopin,

создайте отдельный исполняемый модуль, запускайте его как процесс в асинхронном таске, убейте процесс немедленно, если вам это так нужно, но потом не удивляйтесь, если ФС пойдет по детородному органу или еще чего непредвиденного случится
...
Рейтинг: 0 / 0
26.05.2021, 13:02
    #40073097
fkfka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
Roman Mejtes
если ФС пойдет пойдет по детородному органу

С какого органа ФС пойдет по органу при убивании пользовательского процесса?
...
Рейтинг: 0 / 0
26.05.2021, 21:53
    #40073324
love_bach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
v skopin
Привет всем!

Собственно вопрос в сабже. вопрос возник от сюда
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
            var escape = new Thread(() =>
            {
                while (IsNotCancelled && !test.IsCompleted)
                {
                    if (ReadKey().Key == ConsoleKey.Escape)
                        _cancelSource.Cancel();
                    Write("\b");
                }
            });


Но вообще, стало просто интересно как это возможно...

Заранее благодарю

ЗЫ
escape.Abort() - не просто устарел в .NET 5, а ошибку генерирует


нельзя
...
Рейтинг: 0 / 0
26.05.2021, 23:03
    #40073351
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
v skopin,

как уже сказали и сам MS пишет, метод Abort не поддерживается. Рекомендует создавать отдельный процесс его грохать при необходимости. Правда придётся немного подумать как передать в запускаемый процесс параметры (межпроцессное взаимодействие наладить). Сам вот мучаться буду скоро, перенося проект на .NET 5.

Есть приложение-хост, которое компилирует пользовательский код с блекджеком и запускает на исполнение в таске. Но если пользователь ошибся и правильное не завершил метод или токен отмены не проверил, то хост может бесконечно долго тратить ресурс зря. Была кнопка прибить поток, теперь нет кнопки
...
Рейтинг: 0 / 0
26.05.2021, 23:25
    #40073353
fkfka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
VSVLAD
Есть приложение-хост, которое компилирует пользовательский код с блекджеком и запускает на исполнение в таске. Но если пользователь ошибся и правильное не завершил метод или токен отмены не проверил, то хост может бесконечно долго тратить ресурс зря. Была кнопка прибить поток, теперь нет кнопки

Сама по себе задумка давать пользователю запускать на сервере свой произвольный код на приз года совсем не тянет.
...
Рейтинг: 0 / 0
27.05.2021, 08:06
    #40073390
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
fkfka,

Увы, задачи такие приходят, что времни не напасешся под каждую делать опции в пользовательском интерфейсе. Сейчас продумываем другой подход, делать сценарий на более высоком уровне в виде блок-схем описанные в xml. Уже рабочий прототип есть в аналогичном решении, там можно почти полноценный Control Flow сделать и добавить свой блекджек
...
Рейтинг: 0 / 0
27.05.2021, 10:31
    #40073435
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
я обычно делаю так
Код: c#
1.
2.
3.
4.
5.
6.
7.
private void ThreadRun()  
{
    while (run == true)
    {
        //do something
    }
}       


а если надо завершить
Код: c#
1.
2.
3.
4.
private void ButtonStop_Click(object sender, EventArgs e)
{
    run = false;
}


Мне кажется вполне себе решение.
...
Рейтинг: 0 / 0
27.05.2021, 10:33
    #40073438
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
jenya7
Мне кажется вполне себе решение.
да. В 90-х годах вполне себе нормальное ))
...
Рейтинг: 0 / 0
27.05.2021, 10:54
    #40073445
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
Shocker.Pro
jenya7
Мне кажется вполне себе решение.
да. В 90-х годах вполне себе нормальное ))

Процес при завершении выгрузиться не? Можно создать новый и не париться.
...
Рейтинг: 0 / 0
27.05.2021, 12:19
    #40073470
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
jenya7,

в 2021 году люди используют CancellationToken'ы, таски вместо Thread'ов и другие ништяки.
А это:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
private void ThreadRun()  

{
    while (run == true)
    {
        //do something
    }
}
...
Рейтинг: 0 / 0
27.05.2021, 17:02
    #40073600
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Всё таки можно как-то грохнуть Thread/Task без отмены?
Вообще, получился симпатичный простенький прогресс-бар
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
        private static void DisplayProgress(Task test, CancellationTokenSource cancellation, int frequency = 40)
        {
            void Escape(object _, ConsoleCancelEventArgs consoleCancelEventArgs)
            {
                Write("\b");
                WriteLine("Принудительная остановка [ЧЕГО-ЛИБО], подождите ...");
                cancellation.Cancel();
                consoleCancelEventArgs.Cancel = true;
            }

            CancelKeyPress += Escape;
            CursorVisible = false;

            try
            {
                while (!test.IsCompleted)
                {
                    Write("\\");
                    Thread.Sleep(frequency);
                    if (test.IsCompleted)
                    {
                        Write("\b");
                        break;
                    }

                    Write("\b|");
                    Thread.Sleep(frequency);
                    if (test.IsCompleted)
                    {
                        Write("\b");
                        break;
                    }

                    Write("\b/");
                    Thread.Sleep(frequency);
                    if (test.IsCompleted)
                    {
                        Write("\b");
                        break;
                    }

                    Write("\b—");
                    Thread.Sleep(frequency);
                    Write("\b");
                }
            }
            finally
            {
                CancelKeyPress -= Escape;
                CursorVisible = true;
                Write("\b");
            }
        }

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


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