客户端方法:
private void button6_Click(object sender, EventArgs e)
{
           Top滚动 frm = new Top滚动();// Top滚动是Form,已经在属性框中设置TopMost=true
            frm.Show();                // 窗体没有任何代码,只有一label写着:数据正处理,请等待...            Service.Service ser = new Service.Service();
            ser.HelloWorld();// webservice 方法 请见下}
[WebMethod]
    public string HelloWorld() 
    {
        Thread.Sleep(3000);
        return "Hello World";
    }问题:在ser.HelloWorld()方法没完成之前,frm能打开,但窗体里面的label无法显示.......
是什么原因?请各位大侠指点下

解决方案 »

  1.   

    Service.Service   ser   =   new   Service.Service(); 
    会导致线程阻塞,你用单独的线程执行它,就不会导致主线程阻塞:
    ser.HelloWorld();//   webservice   方法   请见下 
    修改为
                Thread thread = new Thread(new ThreadStart(HelloWorld));
                thread.Start();
    还要修改HelloWorld返回void
      

  2.   

    to computerfox:
    还有其他方法吗?
    我无法用单独的线程执行它,因为实际的代码涉及很多变量和方法,ser.HelloWorld()只是我写的一个简单的代替方法.
      

  3.   

    试下用异步委托Top滚动 frm; 
    void CallHelloWorld()
    {
    Service.Service   ser   =   new   Service.Service(); 
                            ser.HelloWorld();//   webservice   方法
                            frm.Close();     //调用结束,关闭窗体
                    }
    private void button1_Click(object sender, EventArgs e)
    {
    frm = new Top滚动();
    frm.Show();
    this.BeginInvoke(new MethodInvoker(CallHelloWorld));
    }
      

  4.   

    主线程负责打开窗口,子线程去请求webservice
      

  5.   

    to zzx509:
    private void button1_Click(object sender, EventArgs e)
            {
                frm = new Top滚动();
                frm.Show();
                this.BeginInvoke(new MethodInvoker(CallHelloWorld));
            }
    CallHelloWorld 只是我为了说明问题而简单写的方法,实际上 CallHelloWorld 并不只一个函数,而且涉及很多东西,放不进线程,执行时间长,界面假死。所以才想显示一个小窗体让人知道正在处理数据。
      

  6.   

    只能用线程来解决界面假死的问题。你的CallHelloWorld要整理放入单独的方法中。
    Top滚动 frm; 
    void CallHelloWorld()
    {
    //开始工作
    //...
    //完成工作
    this.BeginInvoke((EventHandler)delegate {
    if (frm != null && frm.IsDisposed)
    {
    frm.Close();
    }
    });
    }
    private void button1_Click(object sender, EventArgs e)
    {
    this.BeginInvoke((EventHandler)delegate
    {
    frm = new Top滚动();
    frm.ShowDialog();
                });
    Thread th = new Thread(new ThreadStart(CallHelloWorld));
    th.Start();
    }