Цель: Запускается метод (action). Если операция занимает долгое время (waitMainTask - считает время выполнения), то показываем прогресс и прячем его когда метод mainTaskCompleted завершается. progressTaskCompleted - показывает и скрывает IPopup окнос прогрессом.
Проблема: Во время исполнения не выполняется progressTaskCompleted. все остальные методы отрабатывают. Если ContinueWith(progressTaskCompleted, _scheduler) убрать scheduler - тогда получается зайти в progressTaskCompleted, но невозможно делать изменения в UI без шедулерра.
Не могу понять где проблема.
| Код | class Main { void test() { TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var runTask = new RunTask(); var task = runTask.CreateTask(doSomething, scheduler) .ContinueWith<bool>(..., scheduler); task.Wait(); } }
public class RunTask { public RunTask() { }
public Task CreateTask(Action action, TaskScheduler scheduler) { _scheduler = scheduler; return Task.Factory.StartNew(() => executeAction(action), CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default); }
private void executeAction(Action action) { var t1 = Task.Factory .StartNew(action) .ContinueWith<Task>(mainTaskCompleted);
var t2 = Task.Factory .StartNew<bool>(waitMainTask) .ContinueWith(progressTaskCompleted, _scheduler);//progressTaskCompleted - show and hide progress operation in UI
var tasks = new[] {t1, t2}; Task.WaitAll(tasks);
if (t1.Result.IsFaulted) { throw t1.Result.Exception; } }
private bool waitMainTask() { var showProgress = false; //...calculate working time return showProgress; } private void progressTaskCompleted() {//not step here with _scheduler
//Show and Hide IPopup window } } |
|