[visual-studio]Winform 应用程序: 线程和计时器的问题

标签: Visual-Studio
发布时间: 2014/3/1 3:58:45
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我在做一个非常简单的程序在 Winform (C#)。

不过,遇到一些问题与线程和计时器。我收到短信称 '线程 ' (0x1e30) 已退出,代码 0 (0x0)."我已阅读这是发生时线程成功地停止。然而,这不是什么我想。

该计划被称为"什么是你现在做?"和它的目的是要坐在纸盒中和随机时间间隔 (例如,15 和 120 分钟之间) 都会弹出文字提示,询问我写下什么现在在做。然后,这被记录到一个简单的 txt 文件。想法是单纯的行为"供认"关于自己在做什么会让我更清楚我如何花我在电脑前的时间 (并希望变得更有成效)。

Picture of the app

当我撰写的一些文本 (e.g."Browsing 计算器") 时,它再次使最小化到任务栏和开始时弹出一个新的倒计时。

问题是,不知何故,主线程停止一段时间后的,从而使以及停止计时器。我也不知道为什么 ;我什么都没干与线程不由什么组成每默认 Visual Studio 2012 年作出一个 WinForm 项目时。

当记录时输出,它看起来像这样 (我追加评论):

  • 5 / / 应用程序开始倒计时
  • 4
  • 3
  • 2
  • 1
  • 0 / / 定时器是成品、 显示窗口和等待打"Go!"按钮
  • 4 / / 新倒计时
  • 3
  • 2
  • 1
  • 0 / / 不会显示在窗口 (意) 呢?
  • 0
  • 线程 ' (0x6e0) 已退出,代码 0 (0x0)。
  • 0
  • 0 / 等......

不足够好,能够检测为什么在线程"无名称"停止在该特定时刻我的计时器和线程有关的知识。

这里是我的代码 (我已经删除了一些不太重要的代码 ; 你可以看到: 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());
        }
    }
}

解决方法 1:

我发现了什么问题。显然我重写的程序不能工作的窗体的 Resize 事件中的一些功能。

该程序如果我注释掉下面,按预期方式工作:

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();
            }*/
        }
官方微信
官方QQ群
31647020