C#线程 重复执行

chenpk0912 2010-06-02 04:18:07
小弟现有这么一个需求
带窗体的一个定时服务,然后到点的时候我执行一个更新方法,由于更新数据较多会很慢,导致界面卡住。
所以我用了一个线程执行。现在考虑如果当第一次执行还没结束时,又开始执行第二次更新,就会出错。
我想要的效果:如果第一次正常执行完毕,终止线程或者挂起。如果第二次再次执行的时候第一次还没结束的话,就重新执行这个更新方法。
...全文
1399 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyinweb 2010-11-19
  • 打赏
  • 举报
回复
本人代码如下,不过,UI界面假死
private void myThread()
{
while (true)
{
try
{
ArrayList arrInfo= new ArrayList();


listBox1.Items.Clear();

arrInfo= getData();
for (int i = 0; i < arrInfo.Count; i++)
{
listBox1.Items.Add(arrInfo[i].ToString());
}



Thread thread = new Thread(Task);
thread.IsBackground = true;
thread.Name = "changproxy";
thread.Start();

Thread.Sleep(1);
isCompleted = true;
thread.Join();

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
}
}

}

private void Task(object state)
{
// do something
}
chenpk0912 2010-06-03
  • 打赏
  • 举报
回复
防止沉贴...
卧_槽 2010-06-02
  • 打赏
  • 举报
回复
线程里搞个while(true)就行了
chenpk0912 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gomoku 的回复:]
:) 如果你在Timer事件中另启线程,则:

OnTick(...)
{
if( this.LastRunningThread == null || this.LastRunningThread.Join(1) )
{
this.LastRunningThread = new Thread(...);
this.LastRunningThread.Run();
……
[/Quote]
首先感谢这么多大虾鼎立相助,呵呵,我对线程 还有有点陌生的。
threadOne = new Thread(new ThreadStart(SendEmail));
if (!threadOne.IsAlive)
{
threadOne.Start();
}
我定时的方法就是用的System.Windows.Form.Timer
上面这段是在定时执行里的,然后调用SendEmail()方法
如果第一次没执行完毕,第二次准备执行他的时候 可以重新执行这个方法,而不是跳过
harderLi 2010-06-02
  • 打赏
  • 举报
回复
有那么麻烦吗
操作数据 直接给他个线程 Thread thread1 = new Thread(() =>{操作})
lhm741cs 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 computerfox 的回复:]
在后台执行线程更新数据完毕后,触发一个事件,或者设置一个标识,再次执行之前判断这个标识,如果尚未完成数据更新,则直接return。
[/Quote]

同意这个
sprc_lcl 2010-06-02
  • 打赏
  • 举报
回复
if (isstart)//如果已经开始
{
//设为结束并返回
isstart = false;
return;
}

isstart = true; //上面少了这一句
sprc_lcl 2010-06-02
  • 打赏
  • 举报
回复

private bool isstart = false;

private void start()
{
if (isstart)//如果已经开始
{
//设为结束并返回
isstart = false;
return;
}

while (true)//...
{
if (!isstart)//被结束
{
start();
return;//重新执行
}
//.......
//.........
}
isstart = false;
}
gomoku 2010-06-02
  • 打赏
  • 举报
回复
:) 如果你在Timer事件中另启线程,则:

OnTick(...)
{
if( this.LastRunningThread == null || this.LastRunningThread.Join(1) )
{
this.LastRunningThread = new Thread(...);
this.LastRunningThread.Run();
}
}
兔子-顾问 2010-06-02
  • 打赏
  • 举报
回复
定时器时间过短导致的并发一样可以用线程并发冲突的解决方法来处理。
lock
mutex
monitor
event
兔子-顾问 2010-06-02
  • 打赏
  • 举报
回复
那你干脆用System.Windows.Form.Timer好了。这个是定时发WM_TIMER消息方式实现的,这个不会叠加出现。
捷哥1999 2010-06-02
  • 打赏
  • 举报
回复
在后台执行线程更新数据完毕后,触发一个事件,或者设置一个标识,再次执行之前判断这个标识,如果尚未完成数据更新,则直接return。
sprc_lcl 2010-06-02
  • 打赏
  • 举报
回复
private bool isstart = false;

private void start()
{
isstart = true;
while(true)//...
{
if(!isstart)//执行中被改
{
start();return;//重新执行
}
}
isstart = false;
}
gomoku 2010-06-02
  • 打赏
  • 举报
回复
既然是带窗体的,直接用System.Windows.Form.Timer就可以了。
这里,上一个Timer事件没有完成,那下一个Timer事件就不会开始。

110,524

社区成员

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

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

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