在Timer回调中创建的不希望的Thread终止

时间:2010-11-06 09:16:56

标签: c# multithreading timer callback

这就是我想要做的事情:

  1. 有一个间隔的计时器
  2. 在计时器回调代码中,如果满足某些条件,则应运行另一个线程
  3. 我把我的代码放在一个由主窗体实例化的类中,代码在方法调用时执行('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;
            }
        }
    }
    

3 个答案:

答案 0 :(得分:1)

guess 中,Timer仅保存在方法变量中;听起来对我来说就像Timer正在收集垃圾并最终确定,因此终止了。我怀疑你应该在字段中保留该引用以防止收集。

顺便说一句 - 我怀疑这是原因,但在处理线程时,你应该虔诚地意识到从多个线程访问共享状态;例如:

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

您当前对static bool的访问可能正常,但是......

答案 1 :(得分: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;
        }
    }

答案 2 :(得分: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);
        }
    } 

您尝试使用当前代码执行相同操作:)但不使用计时器