0

如何在不使用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());
}
4

1 回答 1

0

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

如果您在一个阻塞调用中执行了相同的操作...

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

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

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

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

注意上面代码中async和的使用。awaitasync 关键字告诉编译器您希望它构建一个由等待状态驱动的状态机。每个 await 关键字都告诉编译器向状态机添加一个新状态。执行代码时,等待代码设置状态机以在等待的任务(service.GetItemInfoAsync()在本例中)完成时在下一个操作中获取。

HTH。

于 2013-03-11T06:17:50.287 回答