2014-03-27 69 views
0

我使用並行任務庫在後臺運行異步任務。有時我不得不等待後臺任務完成的委託,而UI線程不被阻塞。並行任務無阻塞地等待用戶界面

所以:

  1. 在UI線程開始微調
  2. 在後臺做,需要有一些工作等待
  3. 後執行另一個後臺任務
  4. 在UI
  5. 停止微調

我在UI線程(2)啓動後臺任務後,我試圖調用Wait方法,這是導致死鎖.. 。

我需要一個解決方案來等待指定的後臺任務,而不會阻塞UI線程。 .NET框架是4,所以我不能用asyncawait

更新:

在UI線程:

Task task = Task.Factory.StartNew<T>(() => BackgroundTask()); 
task.ContinueWith(task => CompletedTask(((Task<T>)task).Result); // I want to prevent later tasks to start before this task is finished 
task.Wait(); // this will block the ui... 

任何意見讚賞。

+1

你在Visual Studio 2012或更新的版本?如果是這樣的話,你可以使用包[[Microsoft.Bcl.Async'](https://www.nuget.org/packages/Microsoft.Bcl.Async)在.NET 4.0中啓用異步/等待) –

+0

不幸的是,VS 2010 – hcpeter

+0

使用Stephen Toub的'Then'或'Iterate'模式。更多細節:http://stackoverflow.com/a/22291625/1768303 – Noseratio

回答

1

您可以使用ContinueWith將任務的延續附加到任務,並在任務完成時運行一些代碼。在幕後,await正在做同樣的事情。

當所有任務集合都完成後,您可以使用Task.Factory.ContinueWhenAll繼續運行。

您可以使用UI線程中的TaskScheduler.FromCurrentSynchronizationContext()來獲取能夠在UI線程中調度任務的任務調度程序。

+0

謝謝你的答案,我試過了(也許我犯了一個錯誤或沒有得到重點),但它沒有奏效。 當我在UI線程中調用後臺任務時,我在完成的任務中設置了ContinueWith。但後來在UI線程中,我開始了另一項任務。而我想等到第一個任務完成。這就是爲什麼我嘗試使用Wait。 – hcpeter

+0

@ hcpeter請顯示您嘗試編輯您的問題,然後我們可以幫助您糾正錯誤。 –

+0

@hcpeter存儲對任務的引用,並且在某個稍後的時間點,當您想要在該任務完成後執行某些操作時,請添加一個延續,而不是等待。 – Servy