如何在不使用以下代码中的函数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());
}
答案 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;
}
请注意在上面的代码中使用async
和await
。 async关键字告诉编译器您希望它构建一个由等待状态驱动的状态机。每个await关键字都告诉编译器将新状态添加到状态机。当执行代码时,等待代码设置状态机,以便在等待任务(在这种情况下为service.GetItemInfoAsync()
)完成时在下一个操作中进行提取。
HTH。