在Windows手机上调用Web服务

时间:2013-03-11 05:56:57

标签: c# windows-phone-7 windows-phone-8 windows-phone

如何在不使用以下代码中的函数service_GetItemInfoCompleted()的情况下调用Web服务? 它可以在没有函数service_GetItemInfoCompleted()的情况下得到结果。

有什么想法吗?

private void btnFind_Click(object sender, RoutedEventArgs e)
{
      Service1Client service = new Service1Client();
      service.GetItemInfoAsync(txt1.Text);
      service.GetItemInfoCompleted += new EventHandler<GetItemInfoCompletedEventArgs>(service_GetItemInfoCompleted);    
}

void service_GetItemInfoCompleted(object sender, GetItemInfoCompletedEventArgs e)
{
      txb1.Text = e.Result;
}

示例2

public void running()
{    
      ServiceReference1.WebServiceSoapClient test = new ServiceReference1.WebServiceSoapClient();

      test.ReadTotalOutstandingInvoiceCompleted += new EventHandler<ServiceReference1.ReadTotalOutstandingInvoiceCompletedEventArgs>(serviceClient);  

      test.ReadTotalOutstandingInvoiceAsync();
}

public void serviceClient(object sender, ReadTotalOutstandingInvoiceCompletedEventArgs e)
{

      answer = int.parse(e.Result.ToString());
}

1 个答案:

答案 0 :(得分:0)

上述方法是正确的方法:将请求发送到服务,当它返回时,在文本框中显示返回的数据。

如果您在一次阻止通话中执行了相同的操作......

private void btnFind_Click(object sender, RoutedEventArgs e)
{
    Service1Client service = new Service1Client();
    txtb1.Text = service.GetItemInfoAsync(txt1.Text);
}

...然后您的主UI线程将阻塞,直到从服务返回数据。如果该服务需要几秒钟才能返回,那么您的应用程序的UI会间歇性地“挂起”几秒钟,给您的用户带来非常糟糕的体验。这是一个糟糕的事情,需要不惜一切代价避免!

所以我们想要异步调用你的服务并等待它返回而不阻塞线程。但是,不是手动编写异步代码,而是使用新的async&amp; C#5.0中的await个关键字可以实现与上述相同的目标,但代码和代码更少复杂性:

private async void btnFind_Click(object sender, RoutedEventArgs e)
{
    Service1Client service = new Service1Client();
    string result = await service.GetItemInfoAsync(txt1.Text);
    txtb1.Text = result;
}

请注意在上面的代码中使用asyncawait。 async关键字告诉编译器您希望它构建一个由等待状态驱动的状态机。每个await关键字都告诉编译器将新状态添加到状态机。当执行代码时,等待代码设置状态机,以便在等待任务(在这种情况下为service.GetItemInfoAsync())完成时在下一个操作中进行提取。

HTH。