CSharpScript.RunAsync && Terminate
От: codenet Россия  
Дата: 05.02.19 16:22
Оценка: -1
Привет.

хотел пощупать roslyn и наткнулся на одну проблему.
у меня есть скрип который я запускаю

await CSharpScript.RunAsync("while(true) {Thread.Sleep(1000); Console.WriteLine(""1"");}",...)


собственно вопрос в том, как прибить запущенный скрипт?

вариант 1 — передавать CancelationToken? но я не хочу внутри скрипта писать — while(token.IsCancellationRequested)...
вариант 2 — создать доп thread в котором запустить выполнение скрипта и заабортить его — что тоже не кашерно думаю


Задача — остановить \ пришибить исполнение скрипта (не важно на какой стадии он работает), есть другие способы ?



ps пока склоняюсь к new Threadи прибивать, т.к если много скриптов на await будет висеть я буду забивать ThreadPool
Отредактировано 05.02.2019 16:30 codenet . Предыдущая версия .
Re: CSharpScript.RunAsync && Terminate
От: hi_octane Беларусь  
Дата: 05.02.19 16:35
Оценка: 2 (1)
C>Задача — остановить \ пришибить исполнение скрипта (не важно на какой стадии он работает), есть другие способы ?
Несмотря на очевидную ненадёжность в настоящее время каноничен только CancelationToken. Про Thread.Abort написали столько статей-пугалок что совсем испугались и убрали его из .NET Core. Если задача ненадёжная — всё ещё можно вынести её в отдельный процесс и в случае чего убить процесс целиком.
Re[2]: CSharpScript.RunAsync && Terminate
От: codenet Россия  
Дата: 05.02.19 16:56
Оценка:
Здравствуйте, hi_octane, Вы писали:

C>>Задача — остановить \ пришибить исполнение скрипта (не важно на какой стадии он работает), есть другие способы ?

_>Несмотря на очевидную ненадёжность в настоящее время каноничен только CancelationToken. Про Thread.Abort написали столько статей-пугалок что совсем испугались и убрали его из .NET Core. Если задача ненадёжная — всё ещё можно вынести её в отдельный процесс и в случае чего убить процесс целиком.

в Microsoft.NETCore.App/2.1.5 вроде как есть аборт

хотя я ошибся

throw new PlatformNotSupportedException(SR.PlatformNotSupported_ThreadAbort);




прошло некоторое время...

в net core есть thread.Interrupt его и использую,т.к перспектива выносить в отдельный процесс не очень.
Отредактировано 05.02.2019 18:12 codenet . Предыдущая версия . Еще …
Отредактировано 05.02.2019 18:11 codenet . Предыдущая версия .
Отредактировано 05.02.2019 17:21 codenet . Предыдущая версия .
Re[3]: CSharpScript.RunAsync && Terminate
От: hi_octane Беларусь  
Дата: 06.02.19 07:51
Оценка:
C>в net core есть thread.Interrupt его и использую,т.к перспектива выносить в отдельный процесс не очень.
Ну Thread.Interrupt настолько ускоспециализированный, что его применение возможно только для очень частных случаев.
Re: CSharpScript.RunAsync && Terminate
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.02.19 15:14
Оценка:
Здравствуйте, codenet, Вы писали:

Что типа

public  object CallMethodForTimeOut()
        {
            isRunning = true;
            currentThread = Thread.CurrentThread;
            try
            {
               
                return funcInvokeMethod(methodName, args);
               
            }
            catch (ThreadAbortException)
            {
                Thread.ResetAbort();
            }
            finally
            {
                isRunning = false;

            }
            return null;
        }
и солнце б утром не вставало, когда бы не было меня
Re: CSharpScript.RunAsync && Terminate
От: Danchik Украина  
Дата: 06.02.19 16:13
Оценка:
Здравствуйте, codenet, Вы писали:

C>Привет.


C>хотел пощупать roslyn и наткнулся на одну проблему.

C>у меня есть скрип который я запускаю

C>
C>await CSharpScript.RunAsync("while(true) {Thread.Sleep(1000); Console.WriteLine(""1"");}",...) 
C>


C>собственно вопрос в том, как прибить запущенный скрипт?


Самое правильное передать таки токен и не писать Threda.Sleep(1000), а await Task.Delay(1000, token)
Re[2]: CSharpScript.RunAsync && Terminate
От: codenet Россия  
Дата: 07.02.19 13:04
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Здравствуйте, codenet, Вы писали:


C>>Привет.


C>>хотел пощупать roslyn и наткнулся на одну проблему.

C>>у меня есть скрип который я запускаю

C>>
C>>await CSharpScript.RunAsync("while(true) {Thread.Sleep(1000); Console.WriteLine(""1"");}",...) 
C>>


C>>собственно вопрос в том, как прибить запущенный скрипт?


D>Самое правильное передать таки токен и не писать Threda.Sleep(1000), а await Task.Delay(1000, token)


А если скрипт напишет Вася который о токенах не знает ничего, я скажу ctx.Cancel() из менеджера которое
управляет скриптами, а Васин скрипт продолжит работать т.к он не будет проверять на каждом шаге своего скрипта
на кэнселейшен токен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.