【发布时间】:2015-10-09 06:42:14
【问题描述】:
我的项目有一个 MainForm,我显示 F_Insert 并为 MainForm 设置 MdiParent
F_Insert f = new F_Insert();
f.MdiParent = this;
f.Show();
在 F_Insert 中,我像这样放置了一个带有 CLick 事件的按钮
private void btn_Add_Click(object sender, EventArgs e)
{
//Insert data to SQL
}
此外,我想每隔 5 秒自动上传从 F_Insert 插入的数据
我使用 System.Timer.Timer 并将其设置为 MainForm_Load 中的 Thread
Thread t1 = new Thread(new ThreadStart(Timerss)); //In MainFormLoad event
t1.Start();
public void Timerss()
{
System.Timers.Timer timer = new System.Timers.Timer(5000);
timer.Elapsed += Timer_Insert_Tick;
timer.AutoReset = true;
timer.Start();
}
private static void Timer_Insert_Tick(object sender, System.Timers.ElapsedEventArgs e)
{
//code auto upload data to server here
//Data get from Sql Local to upload SQL in Server
}
问题是它工作得不好。我觉得当我从 F_Insert 插入数据时,数据会受到我在 MainForm 加载中启动的 Timerss 线程的影响。
向您展示我的问题的简单方法:当我拆分两个工作时(插入 并上传)到 2 个不同的工作中,它工作得很好,这意味着我 插入数据完成,然后,我上传数据,它会工作得很好。 但是当我同时插入数据和定时器自动上传的数据时, 我看到一些错误:连接 sql 关闭或打开错误,没有数据获取 从 F_Insert,有时会得到重复数据(旧数据)
请就这个问题给我一些建议。对不起,但我是线程的新手。谢谢!!!
【问题讨论】:
-
什么不起作用?你怎么知道不是?什么错误?等等……
-
我在这里看到的一个问题(我不清楚您的实际问题是什么)是对计时器的唯一引用是在局部变量中。我相信这意味着它可以并且将会被垃圾收集。
-
嗨@Enigmativity,感谢收看!向您展示我的问题的简单方法:当我将两个工作(插入和上传)分成两个不同的工作时,它工作得很好,这意味着我插入数据完成,然后我上传数据,它会工作得很好。但是当我同时插入数据和数据自动上传时,我看到一些错误:连接sql关闭或打开错误,没有从F_Insert获取数据,有时它会得到重复数据(旧数据)......
-
嗨@Damien_The_Unbeliever,我对你的awser很感兴趣,但我不明白你的awser。请告诉我更多关于它的信息!谢谢你!
-
如果我在 FCL 团队中,我会将
[Obsolete("NEVER CREATE THREADS DIRECTLY UNLESS YOU KNOW EXACTLY WHAT ARE YOU DOING")]放在Thread构造函数上。不使用 TPL 或async/await的原因是什么?你在 .NET 3.5 上吗?
标签: c# multithreading timer thread-safety