这就是我想要做的事情:
我把我的代码放在一个由主窗体实例化的类中,代码在方法调用时执行('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;
}
}
}
答案 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);
}
}
您尝试使用当前代码执行相同操作:)但不使用计时器