当前位置:编程学习 > C#/ASP.NET >>

请教下面用thread 和不用thread有什么本质区别阿

1。 OnMouseUp()
{
     populateData();
}
2。 OnMouseUp()
{
     Thread myThread = new Thread(new ThreadStart(populateData));
     myThread.Start();
     myThread .Join();
}



之前用1直接调用populateData 方法,速度很快,5000条记录大概只用4秒钟,但是有一个致命的问题是,在我选择几万条记录,还没结束的时候 在这个期间我又触发了mouseup时间,就会造成crash.
然后我改成2的写法,试图生成一个新的thread 然后用join确保不会crash,但是现在的问题是,用这种方法,速度有明显的下降,5000调记录要40多秒钟。

请教一下牛人们,第2种写法有什么问题吗?为什么性能会这么差?还有没有其他办法呢?确保运行populateData方法期间不再触发这个事件同时保证运行效率??多谢
--------------------编程问答-------------------- 开新线程 耗费了资源 可以使用 主线程异步 实现你要的效果 --------------------编程问答-------------------- 能否给些'主线程异步'相关的信息或者例子?多谢 --------------------编程问答-------------------- 如果多开一个线程真的很慢,可以在第一种方法里加上Application.DoEvents();  --------------------编程问答-------------------- 来学习了。 --------------------编程问答-------------------- 仍然造成crash
引用 3 楼 zenghd 的回复:
如果多开一个线程真的很慢,可以在第一种方法里加上Application.DoEvents();
--------------------编程问答--------------------

是这样加吗?
class MyClass
{
  public void OnSelectionChange()
  {
  this.BuildTree();
  }

  private void BuildTree()
  {
  ....
  for (int i = 0; i < layerCount; i++)
  {
  addNode();
  Application.DoEvents();
  }
  }
}
--------------------编程问答-------------------- --------------------编程问答-------------------- 什么乱七八糟的程序呢?难道你原来4秒钟内连点5000次鼠标?不然怎么会触发OnMouseUp()?

如果不是,那么你为什么写到OnMouseUp()里边搞乱自己的大脑呢? --------------------编程问答-------------------- 是这么加的,我还在其他有loop的地方也加了,还是crash. 
引用 6 楼 zenghd 的回复:
C# code

是这样加吗?
class MyClass
{
  public void OnSelectionChange()
  {
  this.BuildTree();
  }

  private void BuildTree()
  {
  ....
  for (int i = 0; i < layerCount; i++)
  {
  addNode……
--------------------编程问答-------------------- 晕 有这样的牛人4秒钟点5000次鼠标?可以吉尼斯了 实际上我说的5000次是指用鼠标在界面上一次选择5000个features (point, line, polygon)
引用 8 楼 sp1234 的回复:
什么乱七八糟的程序呢?难道你原来4秒钟内连点5000次鼠标?不然怎么会触发OnMouseUp()?

如果不是,那么你为什么写到OnMouseUp()里边搞乱自己的大脑呢?
--------------------编程问答-------------------- 从这个“4秒钟内连点5000次鼠标”,到动不动就new Thread,我估计你设计populateData 的时候也是盲目而混乱的。

不知道你的populateData 是个什么玩意,但是如果你需要它比一个简单的method稍微复杂一些,就应该面向对象设计它。例如可以设计为
public class populateDataTask
{
    public bool 是否正在运行=false;
    public void Execute()
    {
        ......
    }
}
然后又一个static的populateDataTask对象实例负责运行populateData工作。 --------------------编程问答-------------------- 就应该面向对象设计它   -->  就应该基于对象封装它

准确地说这只是基于对象来封装,还谈不上面向对象设计。 --------------------编程问答-------------------- 学习了,都是牛人。 --------------------编程问答-------------------- populateData方法只是用来创建一个节点tree, 地图上每选择一个feature都作为一个节点node加到这个tree上,如果用户在地图上选择5000个features, 就会生成一个有5000个节点的tree. 所以这个method 可能会是一个耗时的过程。现在的问题是,在创建这个tree的过程当中,如果用户同时又在地图上用鼠标选择了10个features,就会造成crash. 整个的workflow是这样:用户在图上选择feature,会触发onMouseUp(或者叫OnSelectionChange)event, 在这个event里,调用populateData方法去创建节点树。我只是在maintain这个程序,致使需要找到解决crash的方法,同时需要保证performance --------------------编程问答-------------------- 如果用户在地图上选择5000个features


你一定要等他点了5000下才开始生成Tree啊? --------------------编程问答-------------------- 什么时候说连点5000下了?当然只是用鼠标draw一次了
引用 15 楼 yuwenge 的回复:
如果用户在地图上选择5000个features


你一定要等他点了5000下才开始生成Tree啊?
--------------------编程问答-------------------- 没看明白
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,