Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Помогите найти ошибку при работе с Task-ами.


Автор: Moid 17.10.2012, 08:57
Цель: 
Запускается метод (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
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)