使用了线程还是会将窗体卡死。。为什么。?

tangjia281323 2012-02-14 01:41:15
直接上代码:

public delegate void myInvoke(); //声明委托

private void Form_Login_Load(object sender, EventArgs e)
{
try
{
Thread th = new Thread(new ThreadStart(DoAutoUpLoad));
th.IsBackground = true;
th.Start();
}
catch
{

}
}

public void DoAutoUpLoad()
{
myInvoke i = new myInvoke(AutoUpLoad);
this.BeginInvoke(i);
}

public void AutoUpLoad()


。。。为什么用了线程了。窗体还是会出现卡死的情况。?。如果我把那段代码给注释了。就不卡死了。。求解。
...全文
314 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiaruyz 2012-02-14
  • 打赏
  • 举报
回复
我的做法是直接在线程里面创建窗体
carler 2012-02-14
  • 打赏
  • 举报
回复
强烈建议使用委托要进行调用。如
public delegate void MyInvoke();
MyInvoke my; //声明委托
private void Form_Login_Load(object sender, EventArgs e)
{
}

public void DoAutoUpLoad()
{
my=new MyInvoke(AutoUpLoad);

my();
}

public void AutoUpLoad();
写的粗了一点反正基本是这个样子






苦苦的潜行者 2012-02-14
  • 打赏
  • 举报
回复
 myInvoke i = new myInvoke(AutoUpLoad);


你的委托AutoUpLoad中是不是有操作UI界面的代码,如果有那么卡是肯定的.
Invoke是将线程调回到主线程(UI线程),这样就会卡了.
天二天 2012-02-14
  • 打赏
  • 举报
回复
从新创建一个新的线程,不能用主线程。

Thread thread = new Thread(this.NewThread);
thread.Start(feature);

private void NewThread(object parameter)
{


qq181818228 2012-02-14
  • 打赏
  • 举报
回复
看了上面的回复,都没有回答到重点
重点是线程里用委托和直接用委托没有区别
该卡还是会卡的。
应该这样做,操作内存和逻辑用线程,主界面更新用委托。
tangjia281323 2012-02-14
  • 打赏
  • 举报
回复
。。还有高手没。?。别让我着问题沉了啊。。。。。
tangjia281323 2012-02-14
  • 打赏
  • 举报
回复
。。。我这个方法是判断需不需要进行程序更新。如果需要更新的话。我先好隐藏主窗体。。弹出更新窗体。所以我才用invoke。sleep的话。一样会把主窗体卡死。。我就纳闷了。不知道情况出现在那里。
tangjia281323 2012-02-14
  • 打赏
  • 举报
回复
。。恩。获取应用程序本身的版本号。需要时间。。通过WebService获取服务器上的版本号又需要时间。加起来大概要20秒左右。郁闷了。。
TNight 2012-02-14
  • 打赏
  • 举报
回复
如果是想加载一些费时间的操作的话,可以先把加载线程先sleep几秒,等主线程加载完在去加载
holdingsky2010 2012-02-14
  • 打赏
  • 举报
回复
你把AutoUpLoad的内容都拷贝到DoAutoUpLoad里试试。原来的委托不要了。
ayzen1988 2012-02-14
  • 打赏
  • 举报
回复
是不是AutoUpLoad()函數裏面的算法太過複雜
tangjia281323 2012-02-14
  • 打赏
  • 举报
回复
。那意思是我不能用主线程了。?。。我这窗体里面就这一个线程啊。怎么弄。?。或者我怎么定义委托或者线程来实现。???
holdingsky2010 2012-02-14
  • 打赏
  • 举报
回复
你用了线程,但是耗时操作都是委托主线程做的。当然会卡死~~嘿嘿
tangjia281323 2012-02-14
  • 打赏
  • 举报
回复
。。兄弟。还在不。? 帮忙直接上代码哈。。谢谢了。
tangjia281323 2012-02-14
  • 打赏
  • 举报
回复
。。因为public void AutoUpLoad()这个方法里面的东西。要跑一段时间。而这个方法是在窗体加载的时候运行的。必须是窗体加载的时候运行。。我要避免这段时间窗体卡死。就这情况了。。怎么避免。?
gama456 2012-02-14
  • 打赏
  • 举报
回复
懂你意思 你是想在线程中改变窗体的状态 或者值 这要通过 委托去处理
tangjia281323 2012-02-14
  • 打赏
  • 举报
回复
我这里因为要在线程里面调用窗体。。所以使用了invoke。。public void AutoUpLoad()这个是最终要调用的方法。。窗体加载的时候。我就开始执行线程。。线程里面执行我要运行的方法。不这么用。?。那样怎么用。?
tangjia281323 2012-02-14
  • 打赏
  • 举报
回复
。那是怎么用的。?。我源码在上面。帮忙改动下啊。。。
gama456 2012-02-14
  • 打赏
  • 举报
回复
请先分清楚 控件 和 thread
gama456 2012-02-14
  • 打赏
  • 举报
回复
不是你这么用的
加载更多回复(1)

110,538

社区成员

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

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

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