现在是这样做的: private void MultiSubject(object obj) { var dt = (DataTable)obj; for (int i = 0; i < dt.Rows.Count; i++) { var textValue = dt.Rows[i]["Text"].ToString(); var duration = int.Parse(dt.Rows[i]["Duration"].ToString());//时间 var watch = new Stopwatch(); watch.Start(); Action fp = () => CycleDrawSubject(textValue); if (readOnlyRichTextBox.IsHandleCreated) readOnlyRichTextBox.Invoke(fp); int time = (duration - Convert.ToInt32(watch.ElapsedMilliseconds)); if (time > 0) { Thread.Sleep(time); } watch.Restart(); //重复执行 if (i == dt.Rows.Count - 1) { i = 0; } } } 调用处: var t = new Thread(MultiSubject); t.Start(dt); 代码写的很烂.... 见笑。
不知道这样行不行,仅仅是个想法。 在做a的时候,设为1, b 2 c 3 d 4 当为1时,也就是a的时间等待了30s便做b,b是为2,然后依此类推。这样行不行??
timer.interval=10000 (十秒钟)
单个timer触发,tick设为最小公约数。。比如楼上那样
你可以设计一个Schedule类型,例如有一个Datetime类型属性和一个方法,然后timer触发了相应事件之后,基本上就是这样处理var now = DateTime.Now; foreach (Schedule x in ScheduleList) { if (x.下次开始执行时间) ThreadPool.QueueUserWorkItem(h => x.Execute()); }
时间不一样不好用timer,
一件事就就要用一个timer,太耗资源了,循环的 “事” 的数量 是不定的
timera_tick()
{
timera.enble=false;
//做a的事情 ,注意如果时间长,多掉一下applicaiton.doevents(),这样界面不会死
timerb.interval=30
timerb.enable=true;
}
timerb_tick()
{
timerb.enble=false;
//做b的事情 ,注意如果时间长,多掉一下applicaiton.doevents(),这样界面不会死
timerc.interval=60
timerc.enable=true;
}
.....
这样的话我有多少事就要创建多少个timer,性能是个极大的消耗
private void MultiSubject(object obj)
{
var dt = (DataTable)obj;
for (int i = 0; i < dt.Rows.Count; i++)
{
var textValue = dt.Rows[i]["Text"].ToString();
var duration = int.Parse(dt.Rows[i]["Duration"].ToString());//时间
var watch = new Stopwatch();
watch.Start();
Action fp = () => CycleDrawSubject(textValue);
if (readOnlyRichTextBox.IsHandleCreated)
readOnlyRichTextBox.Invoke(fp);
int time = (duration - Convert.ToInt32(watch.ElapsedMilliseconds));
if (time > 0)
{
Thread.Sleep(time);
}
watch.Restart();
//重复执行
if (i == dt.Rows.Count - 1)
{
i = 0;
}
}
}
调用处:
var t = new Thread(MultiSubject);
t.Start(dt);
代码写的很烂.... 见笑。
比如:
线程中的循环,只修改一对全局变量的值。
界面的onpaint事件,读取这些全局变量,显示对应界面。不知道同时操作同一个变量值时,是否会有冲突。
求大牛解答。
这么低频的操作,把循环处理放在单线程中就可以;
要想界面有响应,委托是少不了的;
如果是多线程操作全局变量,锁是少不了的.
一个TIMER就行
b 2
c 3
d 4
当为1时,也就是a的时间等待了30s便做b,b是为2,然后依此类推。这样行不行??
foreach (Schedule x in ScheduleList)
{
if (x.下次开始执行时间)
ThreadPool.QueueUserWorkItem(h => x.Execute());
}
foreach (Schedule x in ScheduleList)
{
if (x.下次开始执行时间 <= now)
ThreadPool.QueueUserWorkItem(h => x.Execute());
}
一个TIMER就行