Здравствуйте, 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)