2013-05-09 154 views
-2

我想出去一个网关,获取数据,然后在UI线程上返回。 ContinueWith运行,但网关从来没有?Task.Factory.StartNew无法启动?

ILogonResult result; 

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

的背景是在一个错误的地方在这里,应该是在'ContinueWith' ... – 2013-05-09 18:33:13

+4

参数我看到很多在这里的问题,但真的有没有足够的信息来回答你的问题。 1)你不应该在任务中设置一个'result'变量,你应该返回结果;然后继续可以从'task.Result'读取值。 2)你的'fromUIContext'在错误的地方;您希望它作为“ContinueWith”的第二个参数来使UI线程中的延续运行。 'DoSomeUI'也应该被赋予任务的结果作为参数。另外,Result的类型是什么?不知道用'Authenticate'来说可能会发生什么很难说。 – Servy 2013-05-09 18:33:43

+0

另外,我打算用我的心理调试技术来说'结果'是一个'任务',并且你开始了一个任务,开始一项任务;它在完成任务开始时完成,而不是当它开始的任务实际完成时完成,这就是继续似乎马上运行的原因。 – Servy 2013-05-09 18:34:59

回答

-1

有一展身手,在这一点,似乎你只是希望执行Gateway.Authenticate方法和结果类型返回到您的更新UI的方法。

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

虽然这是一个更好的实践方式,但正如我在对问题本身的评论中所描述的那样,它在功能上是相同的。如果OP中的代码不工作,那么这也不起作用。 – Servy 2013-05-09 18:55:22

+0

我不认为这是完全相同的,因为我正在处理Task参数的结果属性,这意味着它将尝试运行任务并在继续发生之前得到结果。在OP中,他只是将结果设置为新的开始,但继续不使用Task参数的任何属性,因此它将继续前进并触发。结果只是一个变量,虽然它没有初始化,但它有一个类型。 Continuewith将会看到它调用该方法并传递一个空结果。 – Bearcat9425 2013-05-09 19:06:03

+0

这是对“ContinueWith”的调用,而不是对“StartNew”的第二次调用。直到它正在继续的任务完成执行,继续才会开始运行。 **这是整个延续的重点;如果它在任务完成之前就已经完成了,那么它根本就没有任何用处!**它是否使用任务的任何属性都无关紧要。 – Servy 2013-05-09 19:08:32