2013-03-11 103 views
0

如何在不使用下面代码中的函数service_GetItemInfoCompleted()的情况下调用webservice? 它可以得到没有函数service_GetItemInfoCompleted()的结果。在windows phone上调用webservice

有什么想法?

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

回答

0

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

如果你在一个阻塞调用,进行同样的操作...

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

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

所以我们想异步地调用你的服务并等待它返回而不阻塞线程。但是,而不是手工编写异步代码,我们可以使用C#5.0中的新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; 
} 

注意使用asyncawait在上面的代码中。 async关键字告诉编译器你想让它建立一个由等待状态驱动的状态机。每个await关键字都会告诉编译器为状态机添加一个新状态。当执行代码时,当等待执行的任务(在这种情况下为service.GetItemInfoAsync())完成时,等待代码将设置状态机在下一个操作中启动。

HTH。

+0

Thx @Richard Turner。我可以问,如果没有txt1.Text,等待仍然可以运行? – likewer 2013-03-11 06:57:56

+0

我可以在代码的下面添加另一个不同类型的示例。 – likewer 2013-03-11 08:46:19