2013-05-09 56 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