Как стопнуть поток в шаблоне из асинхронного метода?

Gor

Client
Регистрация
30.09.2016
Сообщения
248
Благодарностей
30
Баллы
28
Привет. А как стопнуть поток в шаблоне из асинхронного метода? У меня метод следит за переменной. Если в переменной "Stop", текущий поток зенки должен прерваться на каком бы действии он ни был.
Вот код метода:
C#:
public async static void method(this IZennoPosterProjectModel project)
        {
            await Task.Run(() =>
            {
                for (int i = 0; i < 100; i++)
                {
                    project.SendInfoToLog("Check variable",true);
                    Thread.Sleep(1000);
                    if (project.Variables["controlPanelStatus"].Value == "Stop")
                    {
                        project.SendInfoToLog("Stop program");
                        break;
                    }
                }
            });
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 367
Благодарностей
3 292
Баллы
113
Единственный вариант для потока, скорее всего, будут проверки после каждого действия, например, той же переменной.

Кстати, от Thread.Sleep можно уйти, на более быстрый и удобный вариант с событиями:
C#:
var result = new TaskCompletionSource<string>();
Action<object, StopReceivedEventArgs> handler = delegate(object s, StopReceivedEventArgs e) { result.SetResult(e.Message); };
StopReceived += handler; // подписка на StopReceived для ожидания

try
{
    return result.Task.GetAwaiter().GetResult(); // ожидание события с результатом
}
finally
{
    // когда дождались, выполняем нужный код
    project.Variables["controlPanelStatus"].Value == "Stop"
    StopReceived -= handler;
}
 
Последнее редактирование:

Gor

Client
Регистрация
30.09.2016
Сообщения
248
Благодарностей
30
Баллы
28
Как помню, ZennoPoster.StopTask(Guid.Parse(project.TaskId)) должен сработать нормально в ZennoPoster. В PM project.TaskId - нули.
Мне нужно стопнуть поток в шаблоне, а не шаблон (весь проект). И методы AddTries(-1) или SetTries не подходят, к сожалению, в моем контексте.
И я не понял твой код :( TaskCompletionSource - что за объект? С потоками еще не успел, честно говоря, разобраться. И делегаты пока не использую. Не полностью понимаю чем делегаты отличаются кардинально от методов.
Что за подписка? Какие результаты могут быть (ожидание события с результатом). Как выполнить отписку от события?..
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 367
Благодарностей
3 292
Баллы
113
Мне нужно стопнуть поток в шаблоне, а не шаблон (весь проект). И методы AddTries(-1) или SetTries не подходят, к сожалению, в моем контексте.
Чуть позже заметил и исправил, лучше с почты не комментить. :-)
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 367
Благодарностей
3 292
Баллы
113
TaskCompletionSource - что за объект?
Его обычно используют, при создании ассинхронной функции.
Он ждёт вызова метода SetResult с результатом, который уже возвращает GetResult.
Что за подписка? Какие результаты могут быть (ожидание события с результатом). Как выполнить отписку от события?..
Подписка на событие, которое надо отслеживать. Любой тип переданный TaskCompletionSource<тип>. Отписка последняя в finally.
 
Последнее редактирование:

Gor

Client
Регистрация
30.09.2016
Сообщения
248
Благодарностей
30
Баллы
28
Единственный вариант для потока, скорее всего, будут проверки после каждого действия, например, той же переменной.
жалко. У меня проект большой (
Спасибо за наводку по TaskCompletionSource и прочим подпискам. Буду учить матчасть чуть позже.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 367
Благодарностей
3 292
Баллы
113
жалко. У меня проект большой (
Нужен кубик, который бы выполнялся, после каждого выполнения обычного.
Странно, что разрабы не предусмотрели такую возможность в однопотоке зенки.
 

Gor

Client
Регистрация
30.09.2016
Сообщения
248
Благодарностей
30
Баллы
28
Да мне бы хотя бы API метод какой-то, о большем не прошу )
 

xuroo

Client
Регистрация
07.10.2016
Сообщения
153
Благодарностей
38
Баллы
28
Нужен кубик, который бы выполнялся, после каждого выполнения обычного.
Странно, что разрабы не предусмотрели такую возможность в однопотоке зенки.
Полностью согласен! Пойду Выдвину это предложение, в предложения, если будешь баллотироваться 2024, 1 голос точно есть -)
 

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