powered by simpleCommunicator - 2.0.27     © 2024 Programmizd 02
Map
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Всё таки можно как-то грохнуть Thread/Task без отмены?
18 сообщений из 18, страница 1 из 1
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40072674
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
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40072684
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а еще можно на велеке тормозить засовывая ногу в спицы переднего колеса перед вилкой
...
Рейтинг: 0 / 0
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40072701
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты что в итоге сделать-то хочешь? По коду у меня практически уверенность, что ты пытаешься забить гвоздь отверткой.
...
Рейтинг: 0 / 0
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40072702
v skopin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkfka
Ты что в итоге сделать-то хочешь? По коду у меня практически уверенность, что ты пытаешься забить гвоздь отверткой.
Ecли пользователь не нажал, а другая задача завершилась(test.IsCompleted), то остановить ожидание ReadKey()
...
Рейтинг: 0 / 0
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40072726
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40073012
v skopin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkfka,
Спасибо)
-мой вар-нт сильно хуже)))

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

или (не мой в-нт) зависло всё, а таймаута нет...
...
Рейтинг: 0 / 0
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40073077
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40073094
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v skopin,

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

С какого органа ФС пойдет по органу при убивании пользовательского процесса?
...
Рейтинг: 0 / 0
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40073324
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40073351
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v skopin,

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

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

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

Увы, задачи такие приходят, что времни не напасешся под каждую делать опции в пользовательском интерфейсе. Сейчас продумываем другой подход, делать сценарий на более высоком уровне в виде блок-схем описанные в xml. Уже рабочий прототип есть в аналогичном решении, там можно почти полноценный Control Flow сделать и добавить свой блекджек
...
Рейтинг: 0 / 0
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40073435
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я обычно делаю так
Код: 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
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40073438
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
Мне кажется вполне себе решение.
да. В 90-х годах вполне себе нормальное ))
...
Рейтинг: 0 / 0
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40073445
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
jenya7
Мне кажется вполне себе решение.
да. В 90-х годах вполне себе нормальное ))

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

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

{
    while (run == true)
    {
        //do something
    }
}
...
Рейтинг: 0 / 0
Всё таки можно как-то грохнуть Thread/Task без отмены?
    #40073600
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.
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
18 сообщений из 18, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Всё таки можно как-то грохнуть Thread/Task без отмены?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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