我有一个调用方法并返回通用列表的web服务。 webservice completed方法如下所示(注意:names和e.Result都是List的相同类型):
void SetNames()
{
ServiceReference1.ServiceClient webservice = new ServiceReference1.ServiceClient();
webservice.GetNameCompleted += new EventHandler<GetNameCompletedEventArgs>(webservice_GetNameCompleted);
webservice.GetNameAsync();
}
private void webservice_GetNameCompleted(object sender, ServiceReference1.GetNameCompletedEventArgs e)
{
names = e.Result;
}
我遇到的问题是我只能检索webservice方法中名称列表中的项目。每当我尝试在该方法之外的任何地方访问名称列表中的项目时,它都是空的。例如(这在文本框中不显示任何内容),
List<string> names = new List<string>();
public MainPage()
{
InitializeComponent();
SetNames();
foreach (string name in names)
textBox1.Text += name;
}
但这会显示正确的事情:
private void webservice_GetNameCompleted(object sender, ServiceReference1.GetNameCompletedEventArgs e)
{
names = e.Result;
foreach (string name in names)
textBox1.Text += name;
}
我是Silverlight和webservies的新手,我可能已经在寻找一些东西了。我已经在这方面工作了一段时间,我觉得我需要寻求帮助。任何帮助将不胜感激!
答案 0 :(得分:4)
在Silverlight中,所有对网络服务的调用都是异步(与WPF不同,WPF也可以使用同步调用)。
这意味着在服务向Silverlight客户端发送响应之前,将调用调用Web服务之后的代码。
因此,在MainPage构造函数中,foreach循环在服务返回之前迭代集合,然后迭代空集合。
正确的继续方法是第二种方法:在服务响应后,在专用于此任务的回调方法中初始化集合:webservice_GetNameCompleted。
答案 1 :(得分:1)
您必须等待Web Servicec回调才能完成。 通过defualt所有Silverlight WCF Web服务调用都是异步的。 您正在向Web服务发送请求,与.asmx不同,WCF和Silverlight不再等待Web服务返回结果而继续运行。
所以当你打电话时:
public MainPage()
{
InitializeComponent();
SetNames();
foreach (string name in names)
textBox1.Text += name;
}
应用程序不会停止并等待SetNames返回它刚刚进行的值,因为webservice没有返回结果,但是当你调用foreach时,你仍然有一个空白或空列表。
干杯