客户端方法:
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无法显示.......
是什么原因?请各位大侠指点下
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无法显示.......
是什么原因?请各位大侠指点下
会导致线程阻塞,你用单独的线程执行它,就不会导致主线程阻塞:
ser.HelloWorld();// webservice 方法 请见下
修改为
Thread thread = new Thread(new ThreadStart(HelloWorld));
thread.Start();
还要修改HelloWorld返回void
还有其他方法吗?
我无法用单独的线程执行它,因为实际的代码涉及很多变量和方法,ser.HelloWorld()只是我写的一个简单的代替方法.
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));
}
private void button1_Click(object sender, EventArgs e)
{
frm = new Top滚动();
frm.Show();
this.BeginInvoke(new MethodInvoker(CallHelloWorld));
}
CallHelloWorld 只是我为了说明问题而简单写的方法,实际上 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();
}