2016-04-06 4 views
0

C#android XamarinプロジェクトでWebService(WCF)を使用しています。私はこのコードを使ってサービスをインテリジェンスします。C#XamarinのWCF WebReferenceに関する問題

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

AssStatuscompletedのEventHandlerを作成しました。このコードを使用すると完了しました。

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

私はこれは私の問題です

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

    } 

このコードでWebサービスを呼び出します。 1)ClienteServicio.ConsStatusAsync( "Alarma");私は傾けることができないようにVOIDを返します。 2)私は他のアイテムをチェックする必要があるので、私は完了するのを待つ必要があります最初のアラームは、他のですが、私は理解しない方法。

Im new on Xamarin and C#place私を助けてください。私の英語には申し訳ありません。

答えて

0

は、この方法の代わりに、それを試してみてください。

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

注意を非同期の開始/終了フォームでTask.Factory.FromAsync<T1, T2>()の使用呼び出しの代わりに、イベントベースの以前に使用した非同期(async)。

+0

私はsvc.BeginConsStatusを書いたときに、「エラー\t CS1061 \t「Service1Client」に「BeginConsStatus」の定義がなく、拡張メソッド「BeginConsStatus」が最初に受け入れられないというエラーが表示されます。 "Service1Client"タイプの引数が見つかりました(使用するディレクティブまたはアセンブリ参照がありませんか?)\t HCAndroid \t E:¥programas¥Android¥HCAndroid¥HCAndroid¥FrmEstado.cs アクティブ " –

+0

タスクについての読書。 Factory.FromAsyncしかし、私のBeginConStatusとEndconstatusは何かを理解しています。 –

+0

Visual StudioでAdd Service Referenceオプションを使用してWebサービスクライアントを作成した場合、g非同期メソッドを生成する。または、svcutil.exeを直接使用している場合は、正しいコマンドラインオプションを渡して、非同期メソッドを生成するようにしてください。これは、Begin/Endメソッドのペアを作成する必要があることをクライアントジェネレータに通知するものです。 –

0

Webサービス呼び出しが正しく実行されています。

ClienteServicio_ConsStatusCompletedでは、サーバー応答を検証する必要があります。 ConsStatusCompletedEventArgsにはErrorオブジェクトがあります。それがnullの場合、リクエストは成功し、Resultオブジェクトではレスポンスが返され、エラーがあった場合はErrorオブジェクトでExceptionが返されます。

ClienteServicio.ConsStatusAsync( "Alarma")を呼び出すときに、いくつかの読み込みダイアログを表示し、ClienteServicio_ConsStatusCompletedでそれを却下し、そこからあなたのものを続ける必要があります。

例:(メソッド名はそうしているので、あなたは、ポルトガル語を話すSeens)

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:ClienteServicio.ConsStatus(ない非同期)を実行するタスクを作成し、あなたのUIをブロックすることがあります。

+0

応答のためのThks、私がウェブサービスが終了するのを待つ必要があるImがあることを続けるために、Ex。私はチェックする必要があります "Alarma"と "Sala"はWebservice ClienteServicio.ConsStatusAsync(デバイス)でアクティブであり、WebサービスはClienteServicioのみを表示します。ConsStatusAsync( "Alarma")をASYNCとして返し、VOIDを返すので、次のデバイスをチェックするためにこれが終了するのを待つ方法はわかりません。 –

+0

ちょうど待っていない。 ConsStatusCompletedの "Alarma" em "Sala"にチェックを入れてください。しかし、同期メソッド 'ClienteServicio.ConsStatus'にする必要があります。理論的には、このメソッドを実行するタスクを作成し、終了するタスクを待つことができます。しかし、私がこれを試してみると、UIの犠牲者は酔っ払った。 –

+0

問題は私のwebreferenceが非同期の同期メソッドを持っていない、私は一度に1つのデバイスをチェックすることができますが、私はすべてのデバイスをチェックするループを行う場合ステータスボタンは、 –