1个多线程问题

deknight 2009-09-17 03:32:08
有个程序,有两个线程,线程1在listview中列出一些列表,同时启动线程2,而线程2,需要线程1执行过程中返回的值,才能输出最后的结果,现在的问题是,线程2比较费时,线程1执行完了,可能线程2刚执行到1半,导致最后的结果不正常,我该如何修改?



private int PageStatus;
private string SiteUrl;

private void Main_Load(object sender, EventArgs e)
{
new System.Threading.Thread(new System.Threading.ThreadStart(listviewtest)).Start();
}

public delegate void MyDeleGate();

public void listviewtest()
{
aList.BeginInvoke(new MyDeleGate(GetList));
}

public void GetPage()
{
string Html = aaa.WebHelp.GetWebPage(SiteUrl, "UTF-8");//这里是比较费时间的,它是要取得网站的状态,如果网站速度慢,这也会慢.
if (Html == "Error")
{
PageStatus = 2;
}
else
{
PageStatus = 0;
}
}

public void GetList()//在listview里列出网站和它的状态
{
aList.Items.Clear();
aList.Columns.Clear();
aList.Columns.Add("名称");
aList.Columns.Add("地址");
try
{
取得数据 XXXXX
while (MyReader.Read())
{
SiteUrl = "http://" + MyReader["Url"].ToString();//把网站地址赋值给siteurl,然后通过getpage得到这个站的状态.
Thread oThread = new Thread(new ThreadStart(GetPage));
oThread.Start();
while (!oThread.IsAlive)//怎么感觉没起作用???
{
oThread.Abort();
oThread.Join();
}
ListViewItem li = new ListViewItem();
li.SubItems.Clear();
if (PageStatus == 2)
{
li.ImageIndex = 2;
}
else
{
li.ImageIndex = 0;
}
li.SubItems[0].Text = MyReader["Name"].ToString();
li.SubItems.Add(MyReader["Url"].ToString());
aList.Items.Add(li);
}
conn.Close();
}
catch (Exception exp)
{

}
}

小弟对多线程不太明白,请各位指点,谢谢.
...全文
107 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel6709 2009-09-17
  • 打赏
  • 举报
回复
逻辑混乱
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
多了一句:cout = 0;
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
private int order;

private void Form6_Load(object sender, EventArgs e)
{
cout = 0;
order = 0;
GetList();//
for (; order < this.listView1.Items.Count; )
{
Thread oThread = new Thread(new ThreadStart(GetPage));
oThread.Start();
Thread.Sleep(100);
order++;
}

}
private void GetList()
{

for (int i = 0; i < 9; i++)
{
ListViewItem li = new ListViewItem();
li.Text = i.ToString();
this.listView1.Items.Add(li);
}
}
public void GetPage()
{
int temp = order;
Thread.Sleep(2000);
//获取imageindex
int imageindex1 = temp;//我随便写
listView1.BeginInvoke(new SetImageIndex(aa), new object[] { temp, imageindex1 });
}
public delegate void SetImageIndex(int itemindex, int imageindex);
public void aa(int itemindex, int imageindex)
{

//if(itemindex<9)
this.listView1.Items[itemindex].ImageIndex = imageindex ;
}
deknight 2009-09-17
  • 打赏
  • 举报
回复
楼上2位的方法我刚才试了,都不成...
zhangyanyang 2009-09-17
  • 打赏
  • 举报
回复
执行慢的方法后面给个标志位,执行完后改变标志位
调用前一个结果时先if判断标志位确定执行完后再调用
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 deknight 的回复:]
引用 2 楼 ncjcz 的回复:
没调试,说点想法:
GetList花时间很少,可以直接在主线程里完成(判断li.ImageIndex 的逻辑去掉,后面用线程处理)
GetList完成后,遍历aList.Items,每个item去开一个线程,通过ListView.BeginInvoke来设置ImageIndex

你的意思是:先把listview列出来,图先不去显示,然后再开个线程去看它们的状态,每看一个刷新一下listview?
[/Quote]
恩,大概思路
       private int PageStatus;
private string SiteUrl;
private int order;
private void Main_Load(object sender, EventArgs e)
{
order=0;
GetList();//
for( ;order<;order++ )
{
Thread oThread = new Thread(new ThreadStart(GetPage));
}
}


public void GetPage()
{
string SiteUrl=aList.Items[order].url;
string Html = aaa.WebHelp.GetWebPage(SiteUrl, "UTF-8");//这里是比较费时间的,它是要取得网站的状态,如果网站速度慢,这也会慢.
if (Html == "Error")
{
aList.BeginInvoke(,)
}
else
{
aList.BeginInvoke(,)
}
}

deknight 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ncjcz 的回复:]
没调试,说点想法:
GetList花时间很少,可以直接在主线程里完成(判断li.ImageIndex 的逻辑去掉,后面用线程处理)
GetList完成后,遍历aList.Items,每个item去开一个线程,通过ListView.BeginInvoke来设置ImageIndex
[/Quote]
你的意思是:先把listview列出来,图先不去显示,然后再开个线程去看它们的状态,每看一个刷新一下listview?
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
没调试,说点想法:
GetList花时间很少,可以直接在主线程里完成(判断li.ImageIndex 的逻辑去掉,后面用线程处理)
GetList完成后,遍历aList.Items,每个item去开一个线程,通过ListView.BeginInvoke来设置ImageIndex
deknight 2009-09-17
  • 打赏
  • 举报
回复
请高人帮忙

110,571

社区成员

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

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

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