Xamarin.iOS 中的線程處理
Xamarin.iOS 執行時間可讓開發人員存取 .NET 線程 API,這兩者在使用線程時明確,System.Threading.Thread, System.Threading.ThreadPool
以及在使用異步委派模式或 BeginXXX 方法時,以及支援工作平行連結庫的完整 API 範圍。
Xamarin 強烈建議您使用工作 平行連結庫 (TPL) 來建置應用程式,原因如下:
- 默認 TPL 排程器會將工作執行委派給線程集區,這反過來又會動態增加進程發生時所需的線程數目,同時避免太多線程最終競爭 CPU 時間的情況。
- 就 TPL 工作而言,比較容易考慮作業。 您可以輕鬆地操作它們、排程它們、串行化其執行,或使用一組豐富的 API 平行啟動。
- 它是使用新的 C# 異步語言延伸模組進行程式設計的基礎。
線程集區會根據系統上可用的CPU核心數目、系統負載和應用程式需求,視需要慢慢增加線程數目。 您可以在 中叫用 方法 System.Threading.ThreadPool
,或使用預設值 System.Threading.Tasks.TaskScheduler
(平行架構的 一部分)來使用此線程集區。
開發人員通常需要建立回應式應用程式,且不想封鎖主要 UI 執行循環時,通常會使用線程。
開發回應式應用程式
對UI元素的存取應該受限於執行應用程式主要迴圈的相同線程。 如果您想要從線程變更主要 UI,您應該使用 NSObject.InvokeOnMainThread 將程式代碼排入佇列,如下所示:
MyThreadedRoutine ()
{
var result = DoComputation ();
// we want to update an object that is managed by the main
// thread; To do so, we need to ensure that we only access
// this from the main thread:
InvokeOnMainThread (delegate {
label.Text = "The result is: " + result;
});
}
上述會叫用主線程內容中委派內的程序代碼,而不會造成任何可能損毀應用程式的競爭條件。
線程和垃圾收集
在執行過程中,運行 Objective-C 時間將會建立和釋放物件。 如果物件標示為「自動發行」,執行 Objective-C 時間會將這些物件釋放至線程目前的 NSAutoReleasePool
。 Xamarin.iOS 會針對 和 主線程的每個線程System.Threading.ThreadPool
建立一個NSAutoRelease
集區。 此延伸模組涵蓋在 System.Threading.Tasks 中使用預設 TaskScheduler 建立的任何線程。
如果您使用 建立自己的線程 System.Threading
,則必須提供您自己的 NSAutoRelease
集區,以防止數據外洩。 若要這樣做,只要將您的線程包裝在下列程式代碼段:
void MyThreadStart (object arg)
{
using (var ns = new NSAutoReleasePool ()){
// Your code goes here.
}
}
注意:由於 Xamarin.iOS 5.2,您不再需要提供您自己的 NSAutoReleasePool
版本,因為系統會自動為您提供一個。