2013-07-16 36 views
2

目前我正在做一個涉及Window Workflow Foundation 4的頁面導航控制的項目。我可以通過阻止UI線程來實現這一點,直到WF線程返回url。異步發送數據回到UI線程

但是,這也不是實用的,如果我的WF東西有一個很長的處理時間,那麼UI線程將停止一段時間,用戶沒有意識到這一點。

任何指南,我可以從WF4異步返回我的網址/頁面數據並抓住用戶界面。

+0

你嘗試過異步處理程序嗎? –

+0

不,PKKG。不幸的是,我只使用vs2010和.Net 4。我正在研究Shaamaan的建議。隨時接收任何進一步的建議 – JohnZai

回答

0

有很多選擇,但都是圍繞創建多線程應用程序。

我認爲最簡單的方法是使用BackgroundWorker類(usage example)。

其他選項包括使用.NET 4.5中可用的asyncawait關鍵字(如果您使用的是此版本的dotNET)。如果您使用的是舊版本並且不想使用BackgroundWorker,則可以使用Task類創建後臺任務。更原始的方法涉及使用和管理Thread實例(如果Task類不可用)。看到你使用WF 4時,一些較新的技術應該工作得很好。 ;)

有一點需要注意,大多數人開始使用多線程時忘記了(在那裏完成了) - 您無法從另一個線程訪問屬於UI線程(您的應用的主線程)的資源!這就是爲什麼BackgroundWorker可能是一個很好的開始解決方案,因爲它暴露了2個事件(ProgressChangedRunWorkerCompleted),允許您根據需要在UI上執行某些操作。

* - 通過最簡單的我的意思是最簡單的開始!例如,async/await更適合於需要執行大量不同異步操作的應用程序,但是再一次,這些並不是那麼容易,除非您總體掌握了多線程。

實際上,您沒有指定應用程序將執行多少次異步操作,並且您提到受.NET 4.0限制(因此沒有async/await)。如果你需要執行很多不同的操作,我建議使用Task類。

通過一點點努力,您可以使用任務創建一個可工作的多線程應用程序,而無需訴諸創建意大利麪代碼,這可能是一場真正的噩夢。當您在服務中使用Begin-End異步方法時,此功能特別有用 - 在此情況下,Task.Factory.FromAsync可能非常有用。事件驅動的異步服務還應該公開使用Begin-End的接口。