窗体控件显示问题

wujun_lyx 2010-06-04 10:20:18
客户端方法:
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无法显示.......
是什么原因?请各位大侠指点下
...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wujun_lyx 2010-06-04
  • 打赏
  • 举报
回复
to computerfox:
还有其他方法吗?
我无法用单独的线程执行它,因为实际的代码涉及很多变量和方法,ser.HelloWorld()只是我写的一个简单的代替方法.
shuzhan87 2010-06-04
  • 打赏
  • 举报
回复
线程运行时冲突 注意同步
捷哥1999 2010-06-04
  • 打赏
  • 举报
回复
Service.Service ser = new Service.Service();
会导致线程阻塞,你用单独的线程执行它,就不会导致主线程阻塞:
ser.HelloWorld();//   webservice   方法   请见下 

修改为


Thread thread = new Thread(new ThreadStart(HelloWorld));
thread.Start();


还要修改HelloWorld返回void
fangli8023 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 computerfox 的回复:]

Service.Service ser = new Service.Service();
会导致线程阻塞,你用单独的线程执行它,就不会导致主线程阻塞:
C# code
ser.HelloWorld();// webservice 方法 请见下

修改为

C# code

Thread thread = new Thread(……
[/Quote]

掺和一下,正解。
zzx509 2010-06-04
  • 打赏
  • 举报
回复
只能用线程来解决界面假死的问题。你的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();
}
wujun_lyx 2010-06-04
  • 打赏
  • 举报
回复
to zzx509:
private void button1_Click(object sender, EventArgs e)
{
frm = new Top滚动();
frm.Show();
this.BeginInvoke(new MethodInvoker(CallHelloWorld));
}
CallHelloWorld 只是我为了说明问题而简单写的方法,实际上 CallHelloWorld 并不只一个函数,而且涉及很多东西,放不进线程,执行时间长,界面假死。所以才想显示一个小窗体让人知道正在处理数据。
  • 打赏
  • 举报
回复
主线程负责打开窗口,子线程去请求webservice
zzx509 2010-06-04
  • 打赏
  • 举报
回复
试下用异步委托

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));
}

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧