点击按钮我开始线程:
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是否仍然在运行 - 但它不应该运行,因为它有足够的时间来完成它的运行时间。
答案 0 :(得分:0)
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。线程完成后调用它。