Остановка проекта C# крашит ЗП

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 248
Благодарностей
673
Баллы
113
Доброго времени суток
Есть вот такой код
C#:
                while (true)
                {
                    project.SendInfoToLog("Работаем ОБЩИЙ КОД", true);
                    
                    if (((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted)
                    {
                        project.SendErrorToLog("Остановили", true);
                        throw new Exception();
                    }

                    Thread.Sleep(2000);
                }
Он в бесконечном цикле проверяет нажата ли кнопка остановки проекта в ЗП, и когда её нажимаешь онвыбрасывает эксепшн. Если этот код запустить просто в c# сниппете все нормально работает. ПРоект останавливается и всё гуд.

И вот в общем коде я сделал вот такой асинхронный метод

C#:
        async public void CheckStopProjectAsync()
        {
            await Task.Run(() =>
            {
                while (true)
                {
                    project.SendInfoToLog("Работаем ОБЩИЙ КОД", true);
                    
                    if (((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted)
                    {
                        project.SendErrorToLog("Остановили", true);
                        throw new Exception();
                    }

                    Thread.Sleep(2000);
                }

            });
И в c# сниппете его вызвал

C#:
CommonCode comcode = new CommonCode(instance,project);
comcode.CheckStopProjectAsync();
                  
while (true)
{
    project.SendInfoToLog("Имитация деятельности...", true);
    Thread.Sleep(2000);
}
В итоге у меня вместе с сниппетом работает асинхронный метод который постоянно проверяет не остановлен ли проект.

Так вот когда происходит остановка проекта, асинхронный метод выбрасывает эксепшн как и положено, только вместе с проектом крашится вся зенка и перезапускается. Вопрос) Что не так делаю?)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
В снипете, экшепшн прорабатывается песочницей зенки.
В общем коде, тем более в отдельном потоке, нет никакой песочницы. ты вызвал необрабатываемое исключение и ожидаемо программа крашнула. :bk:
 
  • Спасибо
Реакции: Sherminator

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 248
Благодарностей
673
Баллы
113
В снипете, экшепшн прорабатывается песочницей зенки.
В общем коде, тем более в отдельном потоке, нет никакой песочницы. ты вызвал необрабатываемое исключение и ожидаемо программа крашнула. :bk:
Проверил, в общем коде тоже всё работает, как только делаю метод асинхронным то не работает. Видимо всё из за отдельного потока
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
Проверил, в общем коде тоже всё работает, как только делаю метод асинхронным то не работает. Видимо всё из за отдельного потока
ты проверил вызов процедуры общего кода, вызвав ее из песочницы ? конечно же исключение будет обработано песочницей.
а вот что будет обрабатывать исключение в асинхронном потоке, который был выведен из песочницы, это большой вопрос.
 

Carty

Client
Регистрация
16.06.2021
Сообщения
39
Благодарностей
68
Баллы
18
Очень странный способ проверить прерванность шаблона. Я так понял, задумка была в том, чтобы выбросилось исключение и прервало работу, но как оно должно было это сделать из другого потока... Достаточно проверять IsInterrupted в цикле с имитацией работы, для простоты можно обернуть в extension-метод:
C#:
public static class ProjectExtensions
{
    public static bool IsInterrupted(this IZennoPosterProjectModel project)
    {
        return ((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted;
    }
}
В кубике:
C#:
while (!project.IsInterrupted())
{
    project.SendInfoToLog("Имитация деятельности...", true);
    Thread.Sleep(2000);
}
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 512
Благодарностей
3 368
Баллы
113
Необработанное исключение в отдельном потоке приводит к падению всего процесса.
В реализации .Net это м.б. несколько иначе:
но в любом случае, решить так исходную задачу не получится.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)