2010-11-06 57 views
1

这就是我想做的事:在计时器回调创建的线程不希望终止

  1. 有一些间隔
  2. 在计时器回调代码定时器,如果某些条件得到满足,另一个线程应运行

我把我的代码放在一个由主窗体实例化并且代码在方法调用('StartSync()',se示例代码)上执行的类中。

问题是代码运行了几秒钟但终止。我想我正在做一些愚蠢的事情,但我真的不明白它是什么。感谢有关这方面的任何帮助。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Diagnostics; 

namespace WindowsFormsApplication1 
{ 
    class Syncer 
    { 
     static bool SYNC_IN_PROGRESS; 

     public void StartSync() 
     { 
      SYNC_IN_PROGRESS = false; 
      Timer timer = new Timer(timerCallback, null, 0, 1000); 
     } 

     public void timerCallback(Object stateInfo) 
     { 
      Debug.WriteLine("Sync?"); 

      if (!SYNC_IN_PROGRESS) 
      { 
       SYNC_IN_PROGRESS = true; 

       Thread thSync = new Thread(new ThreadStart(sync)); 
       thSync.Start(); 
      } 
     } 

     void sync() 
     { 
      Debug.WriteLine("Syncing..."); 
      SYNC_IN_PROGRESS = false; 
     } 
    } 
} 
+2

为什么不运行代码在计时器回调,而不是一个新的线程? – 2010-11-06 09:22:44

+0

你写的线程只会保持活动几微秒。很难诊断不可见的代码问题。 – 2010-11-06 12:09:58

回答

0

试试这个更简洁的方法

static volatile bool SYNC_IN_PROGRESS; 
    static thread syncPoll; 

    public void StartSync() 
    { 
     SYNC_IN_PROGRESS = false; 
     syncPoll = new Thread(sync); 
     syncPoll.Start(); 
    } 

    void sync() 
    { 
     while (true) 
     { 
      Debug.WriteLine("Sync?"); 
      if (SYNC_IN_PROGRESS) Debug.WriteLine("Syncing..."); 
      Thread.Sleep(1000); 
     } 
    } 

它确实试图与您现有的代码做同样的:),但不使用定时器

+0

事实上,这个代码更清晰,并且有一些小的补充,这个解决方案实现了我想实现的目标。我想Mitch(上面)提出的方法也可以做到这一点,比如放弃第二个线程并将所有代码放入定时器回调中。 虽然我原来的代码中发生了什么,但我仍然有些困惑。 – Rapunsel 2010-11-06 17:20:09

1

在一个猜测,所述Timer仅在方法变量持有;它听起来像Timer正在垃圾收集和最终确定,因此终止。我怀疑你应该坚持在字段的参考,以防止收集。另外 - 我怀疑它是这里的原因,但是在处理线程时,你应该宗教地意识到从多个线程访问共享状态;例如:

  • 使用Monitor(又名lock
  • 适当使用volatile
  • Interlocked当它适合

您当前访问static bool可能工作确定,但。 ..

+0

Nah,回调让它活着。只要Syncer对象始终保持引用状态。 – 2010-11-06 12:09:01

0

所以这就是我所做的,它似乎工作就好

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 


     private void button1_Click(object sender, EventArgs e) 
     { 
      StartSync(); 
     } 

     static bool SYNC_IN_PROGRESS; 

     public void StartSync() 
     { 
      SYNC_IN_PROGRESS = false; 
      System.Threading.Timer timer = new System.Threading.Timer(timerCallback, SYNC_IN_PROGRESS, 0, 1000); 


     } 

     public void timerCallback(Object stateInfo) 
     { 
      Debug.WriteLine("Sync?"); 

      if (!(bool)stateInfo) 
      { 
       SYNC_IN_PROGRESS = true; 

       Thread thSync = new Thread(new ThreadStart(sync)); 
       thSync.Start(); 
      } 
     } 

     void sync() 
     { 
      Debug.WriteLine("Syncing..."); 
      SYNC_IN_PROGRESS = false; 
     } 
    } 
+0

恐怕这个代码的行为与我的相同(至少在我的机器上);它运行5-10秒,然后停止。 – Rapunsel 2010-11-06 17:21:19

+0

有趣我跑了我的约5分钟。我放弃了等待。大声笑 – Oakcool 2010-11-06 23:11:52