关于c#Xamarin的WCF WebReference的问题
我在一个C#android Xamarin项目上使用WebService(WCF)。我使用此代码初始化服务关于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
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);
}