Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите найти ошибку при работе с Task-ами. проблемы с TaskScheduler 
:(
    Опции темы
Moid
Дата 17.10.2012, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



Цель: 
Запускается метод (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
    }
}


Это сообщение отредактировал(а) Moid - 17.10.2012, 09:09


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0355 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.