2016-04-06 6 views
0

Ich verwende einen WebService (WCF) auf einem C# Android Xamarin-Projekt. Ich benutze diesen Code, um den Service zu intialisieren.Probleme mit WCF WebReference auf C# Xamarin

private void InitializedService1Client() 
    { 
     BasicHttpBinding binding = CreateBasicHttp(); 
     ClienteServicio = new Service1Client(binding, Endpoint); 
     ClienteServicio.ConsStatusCompleted += ClienteServicio_ConsStatusCompleted; 
    } 

Ass Sie können sehen, ich die Eventhandler für consStatuscompleted schaffen, wenn sich Completeed ich diesen Code verwenden.

private void ClienteServicio_ConsStatusCompleted(object sender, ConsStatusCompletedEventArgs e) 
    { 
     if (e.Result == true && Vdispositivo == "Alarma") 
     { 
      RunOnUiThread(() => this.Btnestado.Text = "On"); 
      Vpool = true; 
     } 
     else 
     { 
      RunOnUiThread(() => this.Btnestado.Text = "Off"); 
      Vpool = false; 
     } 

     if (e.Result == true && Vdispositivo == "Sala1") 
     { 
      RunOnUiThread(() => this.BtnSala1.Text = "On"); 
      Vpool = true; 
     } 
     else 
     { 
      RunOnUiThread(() => this.BtnSala1.Text = "Off"); 
      Vpool = false; 
     } 
    } 

Ich rufe den Webdienst mit diesem Code

private void Btnestado_Click(object sender, EventArgs e) 
    { 
     this.TxtEstado.Text = "Entrando.."; 
     Vdispositivo = "Alarma"; 
     ClienteServicio.ConsStatusAsync("Alarma"); 

    } 

Diese meine Probleme sind. 1) Der ClienteServicio.ConsStatusAsync ("Alarma"); Gib VOID zurück, damit ich nicht warten kann. 2) Ich muss warten, um zu beenden, weil ich andere Elemente überprüfen muss, die erste ist Alarma dann andere, aber ich verstehe nicht wie.

Ich bin neu auf Xamarin und C# place mir helfen. und Entschuldigung für mein Englisch.

Antwort

0

es auf diese Weise Versuchen Sie stattdessen:

private async void Btnestado_Click(object sender, EventArgs e) 
{ 
    this.TxtEstado.Text = "Entrando.."; 
    Vdispositivo = "Alarma"; 

    BasicHttpBinding binding = CreateBasicHttp(); 
    var svc = new Service1Client(binding, Endpoint); 

    var task = Task.Factory.FromAsync<string, bool>(
     svc.BeginConsStatus, 
     svc.EndConsStatus, 
     "Alarma", null); 

    var result = await task; 

    if (result == true && Vdispositivo == "Alarma") { 
     this.Btnestado.Text = "On"; 
     Vpool = true; 
    } else { 
     this.Btnestado.Text = "Off"; 
     Vpool = false; 
    } 

    if (result == true && Vdispositivo == "Sala1") { 
     this.BtnSala1.Text = "On"; 
     Vpool = true; 
    } else { 
     this.BtnSala1.Text = "Off"; 
     Vpool = false; 
    } 
} 

Beachten Sie die Verwendung von Task.Factory.FromAsync<T1, T2>() mit dem Beginn/Ende Form von Asynchron anstelle des ereignisbasierten ruft async zuvor verwendete.

+0

Hallo Thks für Ihre Antwort, wenn ich svc.BeginConsStatus schreiben, erhalte ich einen Fehler mir zu sagen, dass „Fehler \t CS1061 \t‚Service1Client‘keine Definition enthält für‚BeginConsStatus‘und keine Erweiterungsmethode‚BeginConsStatus‘Annahme einer ersten Argument des Typs 'Service1Client' könnte gefunden werden (fehlt eine Verwendungsrichtlinie oder eine Assemblyreferenz?) \t HCAndroid \t E: \ Programme \ Android \ HCAndroid \ HCAndroid \ FrmEstado.cs Active " –

+0

Ich lese über Task. Factory.FromAsync Aber Don verstehen, was sind meine BeginConStatus und meine Endconstatus, können Sie mir helfen zu verstehen –

+0

Wenn Ihr Web-Service-Client mit der Option Service-Referenz hinzufügen in Visual Studio erstellt wurde, dann achten Sie darauf, das Kontrollkästchen zu g Async-Methoden erstellen. Oder wenn Sie svcutil.exe direkt verwenden, müssen Sie die richtige Befehlszeilenoption übergeben, um die asynchronen Methoden zu generieren. Das signalisiert dem Client-Generator, dass er Anfangs-/Ende-Methodenpaare erstellen soll. –

0

Sie führen den Webservice-Aufruf ordnungsgemäß aus.

Auf ClienteServicio_ConsStatusCompleted müssen Sie die Serverantwort validieren. Es gibt ein Fehler-Objekt auf ConsStatusCompletedEventArgs. Wenn es null ist, war die Anfrage erfolgreich und Sie erhalten die Antwort im Result-Objekt und ein Exception-on-Error-Objekt, wenn ein Fehler aufgetreten ist.

Wenn Sie ClienteServicio.ConsStatusAsync ("Alarm") aufrufen, müssen Sie ein Ladedialogfeld anzeigen und es bei ClienteServicio_ConsStatusCompleted abbrechen und von dort aus weiterarbeiten.

Ex: (seens Sie sprechen portugiesisch, so die Methodennamen sind so)

ClienteServicio.ConsStatusCompleted += ClienteServicio_ConsStatusCompleted; 
ClienteServicio.ConsStatusAsync("Alarma"); 
mostraDialogoProcessando(); 

... 

private void ClienteServicio_ConsStatusCompleted(object sender, ConsStatusCompletedEventArgs e){ 

    escondeDialogoProcessamento(); 
    if(e.Error != null){ 
     mostraErro(e); 
     return; 
    } 
    restoDoProgramaAPartirDaqui(e.Result); 
} 

OBS: eine Aufgabe erstellen, die ClienteServicio.ConsStatus läuft (nicht Async) kann die Benutzeroberfläche sperren.

+0

Thks für die Antwort, das Problem Ich habe, dass ich warten muss, bis der Webservice beendet ist, um fortzufahren, Ex. Ich muss überprüfen, ob "Alarma" und "Sala" mit dem Webservice ClienteServicio.ConsStatusAsync (Gerät) aktiv sind und der Webservice mir nur ClienteServicio zeigt.ConsStatusAsync ("Alarma") als ASYNC und zurück VOID, so weiß ich nicht, wie man auf das Ende warten muss, um das nächste Gerät zu überprüfen. –

+0

Nur nicht erwarten. Überprüfen Sie "Alarm" in "Sala" auf dem ConsStatusCompleted. Aber sollte eine synchrone Methode sein 'ClienteServicio.ConsStatus'. Theoretisch können Sie eine Aufgabe erstellen, die diese Methode ausführt und auf die Beendigung der Aufgabe wartet. Aber als ich das ausprobierte, war das UI thead lokalisiert. –

+0

Das Problem ist meine Webreference habe keine sync-Methode nur die asynchrone, ich kann 1 Gerät auf einmal überprüfen, aber wenn ich eine Schleife, um alle Geräte zu überprüfen die Status-Schaltflächen nicht den richtigen Wert erhalten, weil das Fehlen erwartet. –