现在的情况是当 webbrowser 加载完毕后会 先执行A() 在执行m.G()单步执行的时候只是过了下函数名但是不执行G()里面的定时器;,再执行B();等执行B()后 才会执行G中的定时器;
而我想要达到的效果是 按顺序执行 先执行A();再执行m.G()里面的内容包括定时器;再执行B();求助;是我写法有错误还是用的定时器有错误呢
M m = new M();
private void test_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
A();
m.G(); // 函数里面有定时器
B();
}
class M(){
System.Windows.Forms.Timer cc = new System.Windows.Forms.Timer();
public M{
cc .Interval = 100;
cc .Tick += new EventHandler(G);
}
public void G()
{
cc.Enabled = true;
}
}
我试了下 如果在test()前面增加一个 MessageBox.Show("ok"); 当弹出“ok”的信息框 但不关掉这个信息框的时候 G里面的定时器会执行;在实际程序中我应该怎么做 可能起到这个相当于增加信息框的作用呢
new M,在哪儿? 因为 cc .Interval = 100;所以会等待那么一下下。。
不好意思我是截取了一段程序出来 new这个操作是有的 我刚才测试了下 如果在test()前面增加一个 MessageBox.Show("ok"); 当弹出“ok”的信息框 但不关掉这个信息框的时候 G里面的定时器会执行;在实际程序中我应该怎么做 可能起到这个相当于增加信息框的作用呢
可能是时间的问题 但是在实际操作中怎么让这个时间等定时器执行完成再往下面执行呢
@wolly: 等你点了弹出框的确定按钮,然后再执行timer吗?
“按顺序执行,(主线程)先执行A();再执行m.G()里面的内容包括定时器;再执行B();”
m.G()里面的Timer启动执行时会使用托管线程池里的另外一个线程,和主线程没有关系,你是感觉不出是m.G()先执行还是B先执行。ps,先执行什么,再执行什么...任务之间有顺序关系的,MS已经封装了更好用的类库,所以,Task is your best choice.
求教“ps,先执行什么,再执行什么...任务之间有顺序关系的,MS已经封装了更好用的类库” 是什么类库呢 我刚学习的 求详细教教我
@wolly: 搜索一下C#+Task关键字.
@wolly: 就是Task这个类。
m 被回收了,把 m 作为 Form 的成员变量。
说得那叫一个乱啊。
楼上大婶的方法都很高大上,我就说个简单一点的方法。
private void test_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { A(); m.G(); // 函数里面有定时器 while(true) { if(jumpFlag) exit while; } B(); } bool jumpFlag =false;
在M的定时器里面完成后给jumpFlag赋值为TRUE;
我上面的代码是伪代码,你修改一下就能用吧,语法我不熟。
void cc_Tick(object sender, EventArgs e) { //todo reset.Set(); } public void G() { cc.Enabled = true; reset.WaitOne(); // B(); 在reset.Set(); 之前是不会执行的 } System.Threading.AutoResetEvent reset= new System.Threading.AutoResetEvent(false);