Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于c#Xamarin的WCF WebReference的问题_C#_Android_Wcf_Xamarin - Fatal编程技术网

关于c#Xamarin的WCF WebReference的问题

关于c#Xamarin的WCF WebReference的问题,c#,android,wcf,xamarin,C#,Android,Wcf,Xamarin,我在一个C#android Xamarin项目上使用WebService(WCF)。我使用此代码初始化服务 private void InitializedService1Client() { BasicHttpBinding binding = CreateBasicHttp(); ClienteServicio = new Service1Client(binding, Endpoint); ClienteServicio.ConsS

我在一个C#android Xamarin项目上使用WebService(WCF)。我使用此代码初始化服务

 private void InitializedService1Client()
    {
        BasicHttpBinding binding = CreateBasicHttp();
        ClienteServicio = new Service1Client(binding, Endpoint);
        ClienteServicio.ConsStatusCompleted += ClienteServicio_ConsStatusCompleted;
    }
Ass您可以看到我为consStatuscompleted创建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;
        }
    }
我使用以下代码调用Web服务

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

    }
这是我的问题。 1) 客户端服务constatusAsync(“Alarma”);返回空,所以我不能等待完成。 2) 我需要等待完成,因为我需要检查其他项目,首先是报警,然后是其他,但我不明白如何完成


我是Xamarin和C#place的新手,帮帮我。对不起,我的英语太差了。

换成这种方式试试:

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;
    }
}
private async void Btnestado\u单击(对象发送方,事件参数e)
{
this.TxtEstado.Text=“Entrando..”;
Vdispositivo=“Alarma”;
BasicHttpBinding=CreateBasicHttp();
var svc=新的Service1Client(绑定,端点);
var task=task.Factory.fromsync(
svc.begin状态,
svc.endconstatus,
“报警”,空);
var结果=等待任务;
如果(结果==true&&Vdispositivo==Alarma){
this.Btnestado.Text=“On”;
Vpool=true;
}否则{
this.Btnestado.Text=“关闭”;
Vpool=false;
}
如果(结果==true&&Vdispositivo==“Sala1”){
this.BtnSala1.Text=“On”;
Vpool=true;
}否则{
this.BtnSala1.Text=“关闭”;
Vpool=false;
}
}

请注意,
Task.Factory.fromsync()
与异步调用的开始/结束形式一起使用,而不是以前使用的基于事件的异步。

您正确地执行了Webservice调用

在客户端服务上,您需要验证服务器响应。ConsStatusCompletedEventArgs上存在错误对象。如果为null,则请求成功,您将在Result对象中获得响应,如果有错误,则在Error对象上出现异常

当您调用clientservicio.constatusAsync(“Alarma”)时,您需要显示一些加载对话框,并在clientservicio\u constatusCompleted关闭该对话框,然后继续从那里执行您的工作

Ex:(看起来你说葡萄牙语,所以方法名是如此)


OBS:创建一个运行ClientServicio.ConsStatus(非异步)的任务可能会阻塞您的UI。

Thks对于响应,我的问题是我需要等待webservice结束才能继续,例如,我需要检查“Alarma”和“Sala”是否在webservice ClientServicio.ConsStatusAsync(设备)中处于活动状态而web服务只将ClienteServicio.constatusasync(“Alarma”)显示为ASYNC并返回VOID,因此我不知道如何等待此结束以检查下一个设备。只是不要等待。选中ConsStatusCompleted上的“Alarma”em“Sala”。但应该是一种同步的方法“ClienteServicio.constatus”。理论上,您可以创建一个运行此方法的任务,并等待该任务终止。但当我尝试此操作时,UI thead被锁定。问题是我的webreference没有同步方法,只有异步方法,我可以一次检查一个设备,但如果我循环检查所有设备,状态按钮不会得到正确的值,因为缺少wait.Hi thk作为您的答案,当我写入svc.beginConstatus时,我收到一个错误,告诉我“错误CS1061'Service1Client'不包含'BeginConstatus'的定义,并且找不到接受'Service1Client'类型的第一个参数的扩展方法'BeginConstatus'(是否缺少using指令或程序集引用?)HCAndroid E:\programas\Android\HCAndroid\HCAndroid\FrmEstado.cs 57 Active“我正在阅读关于Task.Factory.fromsync的内容,但不了解我的BeginStatus和Endconstatus是什么,您能帮助我了解您的web服务客户端是使用Visual Studio中的“添加服务引用”选项创建的吗,然后确保选中该框以生成异步方法。或者,如果直接使用svcutil.exe,请确保传递正确的命令行选项以生成异步方法。这就是向客户机生成器发出的信号,它应该创建开始/结束方法对。
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);
}