2013-05-09 2 views
-2

Я пытаюсь выйти на шлюз, получить данные, а затем вернуться к потоку пользовательского интерфейса. Продолжается ContinueWith, но Gateway никогда не делает ???Task.Factory.StartNew не запускается?

ILogonResult result; 

Task.Factory 
.StartNew(() => 
    { 
     result = Gateway.Authenticate(a, b); 
    }) 
.ContinueWith(task => 
    { 
     TaskScheduler.FromCurrentSynchronizationContext(); 
     DoSomeUI(result); 
    } 
); 
+3

Контекст находится в неправильном месте здесь, он должен быть параметром в 'ContinueWith' ... –

+4

Я вижу много проблем здесь, но есть на самом деле не достаточно информации, чтобы ответить на ваш вопрос. 1) Вы не должны устанавливать переменную 'result' в задаче, вы должны возвращать результат; продолжение может затем прочитать значение из 'task.Result'. 2) Ваш 'fromUIContext' находится не в том месте; вы хотите, чтобы это было вторым аргументом 'ContinueWith', чтобы продолжить выполнение в потоке пользовательского интерфейса. «DoSomeUI» также должен быть дан результат задачи в качестве параметра. Кроме того, каков тип 'Result'? Не зная, что трудно сказать, что может быть с «Authenticate». – Servy

+0

Кроме того, я собираюсь использовать свои психические методы отладки, чтобы сказать, что «результат» - это «Задача » и запуск задачи, которая запускает задачу; он завершается, когда вы завершаете задачу, а не когда выполняемая задача фактически завершается, поэтому продолжение, кажется, запускается сразу же. – Servy

ответ

-1

Имейте идти на это, кажется, вы просто желая выполнить метод Gateway.Authenticate и возвращает этот тип результата к способу, который обновляет свой пользовательский интерфейс.

Task.Factory 
.StartNew(() => 
{ 
    return Gateway.Authenticate(a, b); 
}) 
.ContinueWith((t) => 
{ 
    if (t.Exception == null) 
    { 
     DoSomeUI(t.Result); 
    }else{ 
     //Handle Exception Message 
    } 
} 
); 
+1

Хотя это, безусловно, лучший способ сделать это, как я описал в своем комментарии к самому вопросу, он функционально идентичен. Если код в OP не работает, это тоже не сработает. – Servy

+0

Я не думаю, что это идентично, из-за того, что я воздействую на свойство результата параметра Task, что означает его попытку запустить задачу и получить результат до того, как продолжить с может случиться. В OP он просто устанавливает результат в начале нового, но продолжает, не использует никаких свойств параметра Task, поэтому он будет продолжать и стрелять. Результат - это просто переменная, и в то время как ее не инициализировано, она имеет тип. Продолжаем видеть, как он вызывает этот метод с нулевым результатом. – Bearcat9425

+0

Это вызов 'ContinueWith', а не второй вызов' StartNew'. Продолжение не начнется, пока выполняемая задача не завершится. ** В этом суть продолжения; если он выполнялся до того, как была продолжена задание, это не будет служить никакой цели! ** Неважно, использует ли он какие-либо свойства выполняемой задачи или нет. – Servy

Смежные вопросы