首页 新闻 会员 周边 捐助

关于c#定时器的问题

0
悬赏园豆:50 [待解决问题]

现在的情况是当 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里面的定时器会执行;在实际程序中我应该怎么做 可能起到这个相当于增加信息框的作用呢

wolly的主页 wolly | 初学一级 | 园豆:124
提问于:2015-05-05 10:48
< >
分享
所有回答(5)
0

new M,在哪儿? 因为 cc .Interval = 100;所以会等待那么一下下。。

幻天芒 | 园豆:37205 (高人七级) | 2015-05-05 11:02

不好意思我是截取了一段程序出来 new这个操作是有的  我刚才测试了下 如果在test()前面增加一个 MessageBox.Show("ok"); 当弹出“ok”的信息框 但不关掉这个信息框的时候   G里面的定时器会执行;在实际程序中我应该怎么做 可能起到这个相当于增加信息框的作用呢

 

可能是时间的问题 但是在实际操作中怎么让这个时间等定时器执行完成再往下面执行呢 

支持(0) 反对(0) wolly | 园豆:124 (初学一级) | 2015-05-05 11:14

@wolly: 等你点了弹出框的确定按钮,然后再执行timer吗?

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2015-05-05 12:18
0

“按顺序执行,(主线程)先执行A();再执行m.G()里面的内容包括定时器;再执行B();”
m.G()里面的Timer启动执行时会使用托管线程池里的另外一个线程,和主线程没有关系,你是感觉不出是m.G()先执行还是B先执行。ps,先执行什么,再执行什么...任务之间有顺序关系的,MS已经封装了更好用的类库,所以,Task is your best choice.

JeffWong | 园豆:2328 (老鸟四级) | 2015-05-05 11:19

求教“ps,先执行什么,再执行什么...任务之间有顺序关系的,MS已经封装了更好用的类库”  是什么类库呢 我刚学习的 求详细教教我

支持(0) 反对(0) wolly | 园豆:124 (初学一级) | 2015-05-05 11:22

@wolly: 搜索一下C#+Task关键字.

支持(1) 反对(0) JeffWong | 园豆:2328 (老鸟四级) | 2015-05-05 12:14

@wolly: 就是Task这个类。

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2015-05-05 12:18
0

m 被回收了,把 m 作为 Form 的成员变量。

Launcher | 园豆:45050 (高人七级) | 2015-05-05 11:55
0

说得那叫一个乱啊。

楼上大婶的方法都很高大上,我就说个简单一点的方法。

private void test_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
   A();
   m.G(); // 函数里面有定时器
   while(true)
   {
     if(jumpFlag) exit while;
   }
    
   B();
}
bool jumpFlag =false;

在M的定时器里面完成后给jumpFlag赋值为TRUE;

我上面的代码是伪代码,你修改一下就能用吧,语法我不熟。

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-05-05 12:36
0
  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);
Yu | 园豆:12990 (专家六级) | 2015-05-06 11:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册