Ich bin auf der Suche nach einer einfachen Möglichkeit, eine Aufgabe im Hintergrund zu tun, dann etwas (im Haupt-Thread) zu aktualisieren, wenn es abgeschlossen ist. Es ist in einer niedrigen 'Model' Klasse, so dass ich InvokeOnMainThread nicht aufrufen kann, da ich kein NSObject habe. Ich habe diese Methode:C# einfachen Hintergrund Thread
public void GetItemsAsync(Action<Item[]> handleResult)
{
Item[] items=null;
Task task=Task.Factory.StartNew(() =>
{
items=this.CreateItems(); // May take a second or two
});
task.ContinueWith(delegate
{
handleResult(items);
}, TaskScheduler.FromCurrentSynchronizationContext());
}
Dies scheint gut zu funktionieren, aber
1) Ist dies der beste (einfachste) Weg?
2) Ich mache mir Sorgen um die lokale Variable:
Item{} items=null
Was hört auf, dass verschwindet, wenn die Methode zurückgibt, bevor der Hintergrund-Thread beendet?
Danke.
Danke, das ist im Prinzip besser. Kann sogar die Task-Variable entfernen yourClass.CreateItems (Token) .ContinueWith (t => { }, TaskScheduler.FromCurrentSynchronizationContext()); Schade, wir brauchen "TaskScheduler.FromCurrentSynchronizationContext()" obwohl. Ich möchte eine möglichst einfache API für den Kunden so seine entweder: 1) yourClass.GetItemsAsync (Delegierter (Artikel [] Artikel) {\t // Tun Sie etwas mit Artikel }); oder 2) yourClass.CreateItems (.) ContinueWith (t => { // Tun Sie etwas mit t.Result }, TaskScheduler.FromCurrentSynchronizationContext()); Also ich brauche wirklich die GetItemsAsync-Methode wirklich. – Bbx
Ja, Sie haben Recht. Aber GetItemsAsync ist viel klarer als vorherige Lösung in Bezug auf OO-Prinzipien und aufgabenbasierte Programmierung. Unter Verwendung der vorgeschlagenen Technik wäre es beispielsweise viel einfacher, auf die wartenden/asynchronen Merkmale C# 5.0 zu migrieren. In Bezug auf OOP ist diese Lösung einfacher, weil sie nicht versucht, das Rad zu erfinden. Und vergessen Sie nicht eine Testbarkeit: In diesem Fall können Sie leicht diese Aufgabe von Mock-Implementierung erhalten und jeden Eckfall von Ihnen Client-Code testen. –