Silverlight Webservice问题

时间:2010-10-10 16:32:03

标签: silverlight web-services linq-to-sql wcf

我有一个调用方法并返回通用列表的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的新手,我可能已经在寻找一些东西了。我已经在这方面工作了一段时间,我觉得我需要寻求帮助。任何帮助将不胜感激!

2 个答案:

答案 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时,你仍然有一个空白或空列表。

干杯