我正在用 Winform (C#) 制作一个非常简单的程序。
但是,我在线程和计时器方面遇到了一些问题。我收到一条名为“线程 '' (0x1e30) 已退出,代码为 0 (0x0)”的消息。我读过当线程成功停止时会发生这种情况。然而,这不是我想要的。
该节目被称为“你现在在做什么?” 它的目的是坐在托盘上,并以随机的时间间隔(比如 15 到 120 分钟)弹出一个文本提示,要求我写下我现在正在做的事情。然后将其记录到一个简单的 txt 文件中。这个想法是,仅仅“承认”我正在做的事情就会让我更加意识到我是如何在电脑前度过的(并希望变得更有效率)。
当我写了一些文本(例如“Browsing StackOverflow”)时,它会再次最小化到托盘并开始一个新的倒计时,以确定何时弹出。
问题是主线程会在一段时间后停止,从而使计时器也停止。我不知道为什么; 除了在 Visual Studio 2012 中创建 WinForm 项目时默认创建的线程之外,我没有对线程做任何事情。
记录输出时,它看起来像这样(我附加了评论):
- 5 // 应用程序开始倒计时
- 4
- 3
- 2
- 1
- 0 // 计时器结束,显示窗口并等待点击“Go!” 按钮
- 4 // 新的倒计时
- 3
- 2
- 1
- 0 // 不显示窗口(按预期)?
- 0
- 线程 '' (0x6e0) 以代码 0 (0x0) 退出。
- 0
- 0 // 等等...
我对计时器和线程的了解还不足以检测为什么线程“No Name”会在那个特定时刻停止。
这是我的代码(我删除了一些不太重要的代码;你可以在这里看到它:http: //pastebin.com/5Apfgcpy):
namespace WhatAreYouDoingRightNow
{
public partial class Form1 : Form
{
private string _text; // text that the user will write to
private double _timeLeft; // countdown time
public Form1()
{
InitializeComponent();
label2.Visible = true; // debug label to show timer
this.WindowState = FormWindowState.Minimized; // start minimized in tray
_text = ""; // reset text
WriteLog(true); // write for the first time of today
GetRandomTime(); // get new random time interval
timer1.Interval = 1000; // seconds
timer1.Start(); // start timer
}
// Go button (either by click or hitting Enter)
private void HitGoButton()
{
_text = DateTime.Now + " - " + textBox1.Text; // append date and time
WriteLog(false);
_text = "";
GetRandomTime();
this.WindowState = FormWindowState.Minimized;
}
// Open txt file and write to it
private void WriteLog(bool startOfTheDay)
{
// writes to a txt file using StreamWriter
}
private void GetRandomTime()
{
Random rand = new Random((int) DateTime.Now.Ticks);
_timeLeft = rand.Next(1, 2)*5; // multiplied by 60 to get minutes instead of seconds
}
// Count down to random time and then display the box
private void timer1_Tick(object sender, EventArgs e)
{
// count down
if (_timeLeft > 0)
_timeLeft--;
label2.Text = _timeLeft.ToString(); // debug label to show time
notifyIcon1.Text = _timeLeft.ToString(); // debug show time in tray
Console.WriteLine(_timeLeft); // debug write time to console window
// if time ran out --> show the window
if (_timeLeft <= 0)
{
this.WindowState = FormWindowState.Normal;
}
}
private void button1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
HitGoButton();
}
private void Form1_Resize_1(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Minimized)
{
this.Hide(); // only show in tray icon, not in task bar
}
else if (WindowState == FormWindowState.Normal)
{
this.Show();
}
}
}
}
谁能明白为什么我的程序只运行一次然后退出线程并停止计数?
提前致谢!
更新 1:这里也是设计器文件: http: //pastebin.com/yvWs2VVp
更新 2:这是 Program.cs 的代码(我没有更改任何内容):
namespace WhatAreYouDoingRightNow
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}