Re: у кого время есть, покритикуйте?
От: Sharov Россия  
Дата: 21.04.23 15:39
Оценка: 2 (1)
Здравствуйте, nikkit, Вы писали:


N> private void btStop_Click(object sender, System.EventArgs e)

N> {
N> isStopped = true;
N> edtResult.Text = string.Empty;
N> cancelTokenSource.Cancel();
N> }


Сразу что увидел: если плюхнуть сначала по кнопке Stop, то cancelTokenSource == null, => NRE
cts надо бы конструкторе создавать, а не в методе.
Кодом людям нужно помогать!
Re[5]: у кого время есть, покритикуйте?
От: Sharov Россия  
Дата: 21.04.23 15:45
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Я перечитал ещё раз код в стартовом сообщении и не увидел, чтобы хоть одно из полей, объявление которых вы рекомендовали изменить подобным образом, менялось бы из разных потоков


private void btStart_Click(object sender, System.EventArgs e)
        {
            if (workingTask?.IsCompleted??true)
            {
                cancelTokenSource = new CancellationTokenSource();
                isStopped = false;
                workingTask = Task.Run(async () =>
                {
                    while (!isStopped && !cancelTokenSource.IsCancellationRequested)
                    {
                        if (!isPaused)
                        {
                            DateTime dt;

                            synchronizationContext.Send((_) =>
                            {
                                dt = dtpInputDate.Value.Date.AddDays(1);
                                edtResult.Text = dt.ToString();
                            }, null);
                        }

                        await Task.Delay(timeout);
                    }
                }, cancelTokenSource.Token);
            }
        }

        private void btPause_Click(object sender, System.EventArgs e)
        {
            if (!isStopped)
            {
                isPaused = !isPaused;
                btPause.Text = isPaused ? "Continue" : "Pause";
            }
        }


Чем не из разных потоков доступ к одним и тем же переменным.
Кодом людям нужно помогать!
Re: у кого время есть, покритикуйте?
От: Sharov Россия  
Дата: 21.04.23 15:48
Оценка:
Здравствуйте, nikkit, Вы писали:

N> public MainForm()

N> {
N> InitializeComponent();
N> synchronizationContext = SynchronizationContext.Current;
N> }

Зачем сразу использовать контекст синхронизации, почему бы не использовать Control.Invoke?
Кодом людям нужно помогать!
Re[6]: у кого время есть, покритикуйте?
От: Философ Ад http://vk.com/id10256428
Дата: 21.04.23 16:10
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Чем не из разных потоков доступ к одним и тем же переменным.


Он там намекал на то, что документация написана не очень понятно. Что её можно понять так, будто проблемы будут если несколько потоков меняют переменную.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[2]: у кого время есть, покритикуйте?
От: Философ Ад http://vk.com/id10256428
Дата: 21.04.23 16:13
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Зачем сразу использовать контекст синхронизации, почему бы не использовать Control.Invoke?


Это не гибко: таски легко джойнятся между собой. Мы когда-то так и делали (у меня на предыдущей работе), потом стали просто таски джойнить. Слишком часто оказывается, что после того, как ты показал что-то в гуе, нужно сразу же запускать другую задачу.
Всё сказанное выше — личное мнение, если не указано обратное.
Re: у кого время есть, покритикуйте?
От: 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒  
Дата: 21.04.23 16:45
Оценка:
IsCompleted??true

Имейте ввиду, здесь есть люди которые за такое могут покаличить вашу психику. Если это не автотаск, то как звучало задание? Может, он хотели от вас упора на Rx, может, они хотели посмотреть, будете ли вы делать синхронизацию внутри обработчика событий, а может, просто хотели минимум кода и BW??
Re[3]: у кого время есть, покритикуйте?
От: Sharov Россия  
Дата: 21.04.23 22:02
Оценка:
Здравствуйте, Философ, Вы писали:

S>>Зачем сразу использовать контекст синхронизации, почему бы не использовать Control.Invoke?

Ф>Это не гибко: таски легко джойнятся между собой. Мы когда-то так и делали (у меня на предыдущей работе), потом стали просто таски джойнить. Слишком часто оказывается, что после того, как ты показал что-то в гуе, нужно сразу же запускать другую задачу.

Не понял при чем здесь джойны тасков и ctrl.invoke? Тем более, что это одно и то же по сути -- тыц. Т.е. у нас получается зависимость от посторонней сущности вместо использования уже доступных
контролов. Я бы убрал sync context из кода.
Кодом людям нужно помогать!
Re: у кого время есть, покритикуйте?
От: vaa  
Дата: 24.04.23 01:58
Оценка:
Здравствуйте, nikkit, Вы писали:

N>В общем любой конструктив: критика, советы, вопросы по выбору такой реализации и т.п. категорически приветствуется.

Progress<T> не подойдет?
https://blog.stephencleary.com/2012/02/reporting-progress-from-async-tasks.html
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[6]: у кого время есть, покритикуйте?
От: _FRED_ Черногория
Дата: 24.04.23 07:20
Оценка:
Здравствуйте, Sharov, Вы писали:

_FR>>Я перечитал ещё раз код в стартовом сообщении и не увидел, чтобы хоть одно из полей, объявление которых вы рекомендовали изменить подобным образом, менялось бы из разных потоков


S>Чем не из разных потоков доступ к одним и тем же переменным.


Философ процитировал документацию, в которой говорилось

Ключевое слово volatile означает, что поле может изменить несколько потоков, выполняемых одновременно…

Я же в отквоченном заметил, что в примере поле из нескрольких потоков не меняется. Мне кажется, что есть некоторая разница между "доступом" (то есть, в том числе, "чтением") и "изменением".
Help will always be given at Hogwarts to those who ask for it.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.