Threading in xamarin. IOSThreading in Xamarin.iOS

Die xamarin. IOS-Laufzeit ermöglicht Entwicklern den Zugriff auf die .NET-Threading-APIs, sowohl explizit bei der Verwendung von Threads ( System.Threading.Thread, System.Threading.ThreadPool ) als auch implizit, wenn die asynchronen delegatmuster oder die BeginXxx-Methoden sowie der gesamte Bereich von APIs verwendet werden, die die Task Parallel Library unterstützen.The Xamarin.iOS runtime gives developers access to the .NET threading APIs, both explicitly when using threads (System.Threading.Thread, System.Threading.ThreadPool) and implicitly when using the asynchronous delegate patterns or the BeginXXX methods as well as the full range of APIs that support the Task Parallel Library.

Xamarin empfiehlt dringend, den Task Parallel Library (TPL) zum Entwickeln von Anwendungen aus verschiedenen Gründen zu verwenden:Xamarin strongly recommends that you use the Task Parallel Library (TPL) for building applications for a few reasons:

  • Der standardmäßige TPL-Planer delegiert die Task Ausführung an den Thread Pool, der wiederum dynamisch die Anzahl der für den Prozess benötigten Threads vergrößert, während ein Szenario vermieden wird, bei dem zu viele Threads am Ende der CPU-Zeit konkurrieren.The default TPL scheduler will delegate Task execution to the thread pool, which in turn will dynamically grow the number of threads needed as process takes place, while avoiding a scenario where too many threads end up competing for CPU time.
  • Es ist einfacher, Vorgänge in Bezug auf TPL-Aufgaben zu übernehmen.It is easier to think about operations in terms of TPL Tasks. Sie können Sie problemlos manipulieren, planen, ihre Ausführung Serialisieren oder viele parallel mit einem umfangreichen Satz von APIs starten.You can easily manipulate them, schedule them, serialize their execution or launch many in parallel with a rich set of APIs.
  • Es ist die Grundlage für die Programmierung mit den neuen c#-Async-Spracherweiterungen.It is the foundation for programming with the new C# async language extensions.

Der Thread Pool vergrößert die Anzahl der Threads nach Bedarf, basierend auf der Anzahl der im System verfügbaren CPU-Kerne, der System Auslastung und der Anwendungsanforderungen.The thread pool will slowly grow the number of threads as needed based on the number of CPU cores available on the system, the system load and your application demands. Sie können diesen Thread Pool entweder durch Aufrufen von Methoden in System.Threading.ThreadPool oder mithilfe des standardmäßigen System.Threading.Tasks.TaskScheduler (Teil des parallelen Frameworks) verwenden.You can use this thread pool either by invoking methods in System.Threading.ThreadPool or by using the default System.Threading.Tasks.TaskScheduler (part of the Parallel Frameworks).

In der Regel verwenden Entwickler Threads, wenn Sie reaktionsschnelle Anwendungen erstellen müssen, und Sie möchten die Haupt-UI-Lauf Zeitschleife nicht blockieren.Typically developers use threads when they need to create responsive applications and they do not want to block the main UI run loop.

Entwickeln von reaktionsfähigen AnwendungenDeveloping Responsive Applications

Der Zugriff auf Benutzeroberflächen Elemente sollte auf denselben Thread beschränkt sein, der die Hauptschleife für Ihre Anwendung ausführen soll.Access to UI elements should be limited to the same thread that is running the main loop for your application. Wenn Sie von einem Thread Änderungen an der Hauptbenutzer Oberfläche vornehmen möchten, sollten Sie den Code wie folgt mithilfe von NSObject. invokeonmainthreadin die Warteschlange stellen:If you want to make changes to the main UI from a thread, you should queue the code by using NSObject.InvokeOnMainThread, like this:

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;  
    });
}

Der obige Code Ruft den Code innerhalb des Delegaten im Kontext des Haupt Threads auf, ohne Racebedingungen zu verursachen, die möglicherweise einen Absturz ihrer Anwendung verursachen.The above invokes the code inside the delegate in the context of the main thread, without causing any race conditions that could potentially crash your application.

Threading und Garbage CollectionThreading and Garbage Collection

Im Verlauf der Ausführung werden Objekte von der Ziel-C-Laufzeit erstellt und freigegeben.In the course of execution, the Objective-C runtime will create and release objects. Wenn Objekte für "Automatisches Release" gekennzeichnet sind, gibt die Ziel-C-Laufzeit diese Objekte an den aktuellen des Threads frei NSAutoReleasePool .If objects are flagged for "auto-release" the Objective-C runtime will release those objects to the thread's current NSAutoReleasePool. Xamarin. IOS erstellt einen NSAutoRelease Pool für jeden Thread aus System.Threading.ThreadPool und für den Haupt Thread.Xamarin.iOS creates one NSAutoRelease pool for every thread from the System.Threading.ThreadPool and for the main thread. Dadurch werden alle Threads behandelt, die mit dem Standard Task Scheduler in System. Threading. Tasks erstellt wurden.This by extension covers any threads created using the default TaskScheduler in System.Threading.Tasks.

Wenn Sie Ihre eigenen Threads mithilfe System.Threading von erstellen, müssen Sie einen eigenen Pool bereitstellen NSAutoRelease , um zu verhindern, dass die Daten nicht mehr vorhanden sind.If you create your own threads using System.Threading you do have to provide you own NSAutoRelease pool to prevent the data from leaking. Umschließen Sie zu diesem Zweck einfach den Thread in den folgenden Code Ausschnitt:To do this, simply wrap your thread in the following piece of code:

void MyThreadStart (object arg)
{
   using (var ns = new NSAutoReleasePool ()){
      // Your code goes here.
   }
}

Hinweis: seit xamarin. IOS 5,2 müssen Sie nicht mehr ihren eigenen bereitstellen, NSAutoReleasePool da eine für Sie automatisch bereitgestellt wird.Note: Since Xamarin.iOS 5.2 you do not have to provide your own NSAutoReleasePool anymore as one will be provided automatically for you.