线程

T_long 2010-11-08 10:16:50
在一个窗体中点一个按钮执行另一个类中的方法
public void PublishAllHouse(List<int> WebId, List<int> HouseId)
{
int AllCount = 0;
try
{
//new Thread(() =>
//{
// Control.BeginInvoke(new Action(() =>
// {
Thread.Sleep(200);
for (int i = 0; i <= HouseId.Count - 1; i++)
{
for (int j = 0; j <= WebId.Count - 1; j++)
{
PublishHouseFactory publishhousefactory = new PublishHouseFactory();
PublishHouse publishhouse = null;
publishhouse = publishhousefactory.CreatePublishHouse(WebId[j].ToString());
PublishHouse.WebInfoId = WebId[j];
PublishHouse.HouseInfoId = HouseId[i];
AllCount++;
Thread t = new Thread(new ThreadStart(publishhouse.ToPublishHouse));
t.Start();
//Thread.Sleep(500);
//Control.Invoke((MethodInvoker)delegate
//{
// publishhouse.ToPublishHouse();
//});
}
}
// }));
//}).Start();
}


执行这个方法时窗体不能拖动了,怎么解决,谢谢!!
...全文
134 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
uncanny 2010-11-08
  • 打赏
  • 举报
回复
主线程执行循环的时候,是不能操作其他控件的。
只能把这个循环 做到子线程里
T_long 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bloodish 的回复:]
开一个线程,我想你自己原来有思路的,但不知道为什么要改成在循环里不停开线程.


C# code

new Thread(() =>
{
for (int i = 0; i <= HouseId.Count - 1; i++)
{
……
[/Quote]
我郁闷啊…………
这是上个星期写的,已经好了
我今天来直接注释了,又慢慢调试………………
晕…………
T_long 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wuyazhe 的回复:]
你的意思线程中创建了窗体?如何创建的?
哪个窗体要想拖动也是以来消息,你要么一段时间执行Application.DoEvents();要么再开一个线程执行Application.Run(窗体);来单独处理窗体消息。
[/Quote]
不是,我是说在窗体中执行类中的方法,窗体不能拖动了……
bloodish 2010-11-08
  • 打赏
  • 举报
回复
开一个线程,我想你自己原来有思路的,但不知道为什么要改成在循环里不停开线程.


new Thread(() =>
{
for (int i = 0; i <= HouseId.Count - 1; i++)
{
for (int j = 0; j <= WebId.Count - 1; j++)
{
PublishHouseFactory publishhousefactory = new PublishHouseFactory();
PublishHouse publishhouse = null;
publishhouse = publishhousefactory.CreatePublishHouse(WebId[j].ToString());
PublishHouse.WebInfoId = WebId[j];
PublishHouse.HouseInfoId = HouseId[i];
AllCount++;
publishhouse.ToPublishHouse();
}
}

}).Start();
兔子-顾问 2010-11-08
  • 打赏
  • 举报
回复
你的意思线程中创建了窗体?如何创建的?
哪个窗体要想拖动也是以来消息,你要么一段时间执行Application.DoEvents();要么再开一个线程执行Application.Run(窗体);来单独处理窗体消息。
  • 打赏
  • 举报
回复
PublishAllHouse这个方法的执行不要使用同步,异步解决
李先生2017 2010-11-08
  • 打赏
  • 举报
回复
在for循环里面开启线程不是一个好的做法,再梳理一下程序逻辑流程,尽量不要这么干
T_long 2010-11-08
  • 打赏
  • 举报
回复
不需要与UI同步,窗体有个按钮,点击后,跑到这个方法里面(在另一个类中),如何让那个窗体让拖动,现在拖不动
兔子-顾问 2010-11-08
  • 打赏
  • 举报
回复
publishhouse.ToPublishHouse
这里是不是以开始就要和ui同步,执行Invoke吧所有操作都括进去了?
线程的目的是尽量释放ui线程占用。
你检查一下,在必要时候,使用
this.Invoke((EventHandler)delegate
{
//更新ui
});

非ui的消耗时间的不要Invoke中写。
Invoke就把线程和ui线程同步到一起了。
T_long 2010-11-08
  • 打赏
  • 举报
回复
这个好像开了很多线程,怎么开一个就能解决问题……

110,535

社区成员

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

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

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