2012-03-26 11 views
0

Nach gooling für Ewigkeiten, und lesen einige Sachen über async Aufgabe in Büchern. Ich habe mein erstes Programm mit einer asynchronen Aufgabe gemacht. Nur um herauszufinden, dass ich nur eine Aufgabe starten kann. Ich möchte die Aufgabe mehr als einmal ausführen. Hier habe ich herausgefunden, dass das nicht zu funktionieren scheint. ein wenig klarer, hier sind einige Teile meines Codes zu sein:Mehrere Instanzen der gleichen Async-Aufgabe (Windows Phone)

InitFunction(var); 

Dies ist die Aufgabe selbst

public async Task InitFunction(string var) 
    { 

      _VarHandle = await _AdsClient.GetSymhandleByNameAsync(var); 

      _Data = await _AdsClient.ReadAsync<T>(_VarHandle); 

      _AdsClient.AddNotificationAsync<T>(_VarHandle, AdsTransmissionMode.OnChange, 1000, this); 

    } 

Dies funktioniert wie ein Charme, wenn ich die Aufgabe nur einmal ausführen .. Aber ist Es gibt eine Möglichkeit, es mehrmals auszuführen. Etwas wie das?

InitFunction(var1); 
InitFunction(var2); 
InitFunction(var3); 

Denn wenn ich dies tun jetzt (auf einmal mehrere Aufgaben), ist es die Aufgabe noch beginnen will, läuft, und es löst eine Ausnahme.

Wenn mir jemand dabei helfen könnte, wäre das super!

~ Bart

Antwort

2

async/await perfekt arbeiten mit mehreren Aufgaben und mehrere Aufgaben auf einmal. Manchmal können jedoch verschiedene Objekte Einschränkungen für die Anzahl der asynchronen Operationen gleichzeitig festlegen. Die Klasse Ping kann nur zum Senden von jeweils einem Ping verwendet werden. Wenn Sie mehrere Pings gleichzeitig senden möchten, müssen Sie mehrere Instanzen Ping verwenden.

Ich vermute, das gleiche Problem ist hier im Spiel: _AdsClient ist wahrscheinlich auf eine einzige asynchrone Operation auf einmal beschränkt. Wenn Sie also mehrere InitFunction s gleichzeitig ausführen möchten, müssen Sie mehrere Instanzen desselben Typs verwenden.

Auf der anderen Seite, wenn man wollte InitFunction mehrere Male, einer nach dem anderen laufen, dann müssen Sie nur ein paar await s Ihrem Anruf Code hinzu:

await InitFunction(var1); 
await InitFunction(var2); 
await InitFunction(var3); 

Dies ist wahrscheinlich funktionieren wird - es sei denn, _AdsClient hat Semantik "One-Time-Use". Einige Klassen haben diese Einschränkung.

+0

Oke, Vielen Dank für Ihre Antwort. Aber ich habe gerade herausgefunden, dass es tatsächlich ein Problem mit einer "einmaligen" Einschränkung war. In AdsClient habe ich versucht, einen Socket zu öffnen. Dies ist der Fall, wenn die zweite Instanz fehlgeschlagen ist, weil der Socket gerade ausgeführt wurde oder bereits von der ersten Task geöffnet wurde. Danke für deine Antwort, die Dinge sind jetzt klar! –

Verwandte Themen