2016-11-09 3 views
2

hier im gleichen Kontext bleibt, ist was ich habe:C# awaitable Aufgabe

  • eine Multi-Plattform (Xamarin/C#) Anwendung

  • eine Schnittstelle, die ein Verfahren (für eine Benutzerschnittstellenaufgabe definiert,), die plattformspezifische Implementierungen

  • auf einer Plattform hat muss die Implementierung einige async Anrufe warten, auf der anderen - es ist nicht

My Umsetzung:

  • die Schnittstelle definiert das Verfahren, wie: Aufgabe DoSomething()

  • auf der Plattform, wo die Umsetzung async ruft

Verfahren abzuwarten hat, implementiert als:

async Task DoSomething() 
{ 
    // code 
    await // async(); 
    // code 
} 

und das funktioniert gut

  • auf der Plattform, wo die Umsetzung nicht andere Asynchron-Methoden nicht nenne ich haben 2 Möglichkeiten:

    1. die Methode als async Aufgabe DoSomething definieren() und erhalten eine Kompilierzeit Warnung "Diese asynchrone Methode fehlt 'warten' Bediener und wird synchron ausgeführt ..."

    2. definieren Sie die Methode als Aufgabe DoSomething(), die Task.Run (() => {/ Hauptlogik hier /} zurückgibt, aber wenn ich call erwarte DoSomething() - die Hauptlogik wird auf einem anderen Thread ausgeführt, die ich nicht passieren will. Mit der Implementierung in (1) calling wait bleibt DoSomething im selben Thread.

Wie löse ich das - geben eine awaitable Aufgabe, die nicht async ist und bleibt auf dem gleichen Thread/Kontext?

Antwort

4

Sie sollten return Task.FromResult(returnValueHere) verwenden. Es wird etwas schneller und bleibt im selben Thread. Und vergessen Sie nicht, async aus der Methodendeklaration zu entfernen.

Wenn Ihre Methode nichts zurückgibt, können Sie auch einfach return Task.FromResult(0) verwenden.

public Task DoSomething() 
{ 
    // Work done here 
    return Task.FromResult(0); 
} 
+0

Scheint zu arbeiten - danke! – Dar