Re: у кого время есть, покритикуйте?
От: Философ Ад http://vk.com/id10256428
Дата: 21.04.23 11:04
Оценка: 9 (2) +1
Здравствуйте, nikkit, Вы писали:
N>В общем любой конструктив: критика, советы, вопросы по выбору такой реализации и т.п. категорически приветствуется.

0) Зачем создавать таску и сию секунду отправлять в контекст GUI!?
Таски с такой логикой бессмысленны — разве что сожрать больше памяти и процессора хочется.


1)
а)
N>
N>        private bool isPaused = false;
N>        private bool isStopped = false;
N>


volatile

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

N>


Лучше вот так:
//в гуёвом треде
uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
....
//внутри таски
task = Task.Factory.StartNew(.........CancellationToken, TaskCreationOptions, uiScheduler )
task.Wait()


Обоснование уже не помню: с synchronizationContext в чистом виде какие-то проблемы раньше были.

в)
Scheduler желательно указывать всегда самостоятельно: TaskScheduler.Current может не равно TaskScheduler.Default — огребёшь проблем.

г) Лучше не делать таску внутри таски — лучше
                   .ContinueWith(task => {
                    if (task.Exception != null) {
                        AggregateException _exc = task.Exception.Flatten();
                        ShowError(_exc.InnerException);
            return;
                    }

           ....
            //тут твоя логика
                }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, GetUITaskScheduler());


2) await Task.Delay(timeout);
Насчёт вот этого не уверен. Почитал — оно вообще создано для другого. Оно таску создаёт, которой можно ContinueWith(...).
Здесь лучше Thread.Sleep(0)
Всё сказанное выше — личное мнение, если не указано обратное.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.