共用方式為


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 版本,因為系統會自動為您提供一個。