线程消失了吗?

时间:2015-04-21 14:11:36

标签: c#

点击按钮我开始线程:

Thread myThread = new Thread(TestThread);
myThread.IsBackground = true;
myThread.Start();

内线程方法:

// Start stopwatch
var watch = Stopwatch.StartNew();


// Our method
HelperMethods.Mymethod(
    "19-04-2015",
    "20-04-2015",
    Properties.Settings.Default.username,
    Properties.Settings.Default.password
);


// stop it
watch.Stop();

// Get number of ellapsed milliseconds
var elapsedMs = watch.ElapsedMilliseconds;


TimeSpan t = TimeSpan.FromMilliseconds(elapsedMs);
string answer = string.Format(
    "{0:D2}h:{1:D2}m:{2:D2}s:{3:D3}ms",
    t.Hours,
    t.Minutes,
    t.Seconds,
    t.Milliseconds
);


MessageBox.Show("Done " + answer);

昨天我启动了这个帖子,让我的电脑无人看管(Windows + L)。 第二天,我正等着看上面的消息框说"完成"。 但即使Mymethod 在该期间内终止,它也不存在。 Mymethod内的整个代码位于try/catch内,我记录了异常 发生在该方法内部。奇怪的是没有记录异常 表明我的程序意外终止或其他什么。 记录的最后一条消息(NB:我只记录错误)是从前一天晚上9点左右开始的。 那之后,没有迹象...... 我在奇怪的情况......这里会发生什么? 有任何想法吗? 可悲的是,我没有回来就终止了申请 能够检查Mymethod是否仍然在运行 - 但它不应该运行,因为它有足够的时间来完成它的运行时间。

3 个答案:

答案 0 :(得分:0)

应该在UI线程上调用

MessageBox.Show(),而不是从后台线程调用。我建议使用带有延续的Task

var task = Task.Factory.StartNew(TestThread);
task.ContinueWith(parent => 
{
    if(parent.Exception != null)
        MessageBox.Show("Done.");
    else
        MessageBox.Show("Exception occurred.");
}, TaskScheduler.FromCurrentSynchronizationContext());

上面将在另一个线程上启动你的方法,当方法完成时,它将调度来自ContinueWith()的lambda在UI线程上执行。这样,对MessageBox.Show()的调用不会破坏您的申请。

当然,不要忘记从MessageBox.Show()方法中移除对TestThread的调用。

答案 1 :(得分:0)

通常,Windows被配置为在用户长时间没有输入时进入睡眠状态甚至休眠状态(默认情况下 - 大约15-30分钟,我猜)。

考虑到它被留了一整夜,它可以进入睡眠并停止所有过程。所以,基本上线程运行了一段时间,但后来由于机器进入睡眠模式而暂停。而剩下的时间并没有奏效。当你回来时 - 线程恢复,但应用程序很快关闭。换句话说,机器大多数时间都没有工作,并且线程没有时间运行到最后。关闭app你就完全停止了。

以下是HelperMethods.Mymethod的替换,它在一个单独的后台线程中执行,就像你的情况一样:

while(i < 1000) { 
    Console.WriteLine(DateTime.Now); 
    i++; 
    Thread.Sleep(1000); 
}

当我运行它并将机器变为睡眠时 - 这是我得到的输出。

4/21/2015 6:00:45 PM
4/21/2015 6:00:46 PM
4/21/2015 6:00:47 PM
4/21/2015 6:00:48 PM
*** gap here. machine is in sleep, thread not working ***
4/21/2015 6:01:02 PM
4/21/2015 6:01:03 PM
4/21/2015 6:01:04 PM

此外,调用方法Mymethod是一个坏主意。方法名称应该是描述性的。如果不深入研究它应该很容易理解它在做什么。

答案 2 :(得分:-1)

MessageBox.Show(&#34;完成&#34; +回答);它崩溃了,这会导致你的线程消失。您应该将调用移到线程外的MessageBox.Show。线程完成后调用它。