我有一個主要的WPF窗口,其中一個控件是我創建的用戶控件。這個用戶控制是一個模擬時鐘,幷包含一個更新小時,分鐘和秒針的線程。最初它不是一個線程,它是一個計時器事件,更新了小時,分鐘和秒鐘,但我已將它更改爲一個線程,因爲當用戶按下開始按鈕然後時鐘不會更新,所以我改變它爲一個線程。 WPF窗口當WPF應用程序關閉時自動退出線程
代碼片段:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:GParts"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes
assembly=PresentationFramework.Aero"
xmlns:UC="clr-namespace:GParts.UserControls"
x:Class="GParts.WinMain"
Title="GParts"
WindowState="Maximized"
Closing="Window_Closing"
Icon="/Resources/Calendar-clock.png"
x:Name="WMain"
>
<...>
<!-- this is my user control -->
<UC:AnalogClock Grid.Row="1" x:Name="AnalogClock" Background="Transparent"
Margin="0" Height="Auto" Width="Auto"/>
<...>
</Window>
我的問題是,當用戶退出應用程序,然後線程似乎繼續執行。我希望線程在主窗口關閉時自動完成。用戶控制構造的
代碼片段:
namespace GParts.UserControls
{
/// <summary>
/// Lógica de interacción para AnalogClock.xaml
/// </summary>
public partial class AnalogClock : UserControl
{
System.Timers.Timer timer = new System.Timers.Timer(1000);
public AnalogClock()
{
InitializeComponent();
MDCalendar mdCalendar = new MDCalendar();
DateTime date = DateTime.Now;
TimeZone time = TimeZone.CurrentTimeZone;
TimeSpan difference = time.GetUtcOffset(date);
uint currentTime = mdCalendar.Time() + (uint)difference.TotalSeconds;
christianityCalendar.Content = mdCalendar.Date("d/e/Z", currentTime, false);
// this was before implementing thread
//timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
//timer.Enabled = true;
// The Work to perform
ThreadStart start = delegate()
{
// With this condition the thread exits when main window closes but
// despite of this it seems like the thread continues executing after
// exiting application because in task manager cpu is very busy
//
while ((this.IsInitialized) &&
(this.Dispatcher.HasShutdownFinished== false))
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
{
DateTime hora = DateTime.Now;
secondHand.Angle = hora.Second * 6;
minuteHand.Angle = hora.Minute * 6;
hourHand.Angle = (hora.Hour * 30) + (hora.Minute * 0.5);
DigitalClock.CurrentTime = hora;
}));
}
Console.Write("Quit ok");
};
// Create the thread and kick it started!
new Thread(start).Start();
}
// this was before implementing thread
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
{
DateTime hora = DateTime.Now;
secondHand.Angle = hora.Second * 6;
minuteHand.Angle = hora.Minute * 6;
hourHand.Angle = (hora.Hour * 30) + (hora.Minute * 0.5);
DigitalClock.CurrentTime = hora;
}));
}
} // end class
} // end namespace
怎麼能當主窗口關閉,然後應用程序退出我自動從線程退出?
調度程序只在事件處理程序完成時運行。如果他在事件處理程序中有很長的計算時間,調度程序將不會運行以分派計時器事件。 – Gabe
好的,謝謝,但是當主應用程序(窗口)關閉或用戶退出應用程序時,如何退出while循環?我的while循環是正確的?我已經測試,當退出應用程序的線程完成並達到線:console.write(「退出確定」)但由於某種原因退出應用程序後,我注意到CPU使用率是非常高的任務管理器,它似乎線程真的沒有完成執行。當用戶退出應用程序(關閉包含用戶控制模擬時鐘的主窗口)時,while循環中的正確條件以便退出並從線程中退出? 謝謝。 – toni
我認爲發生了什麼事情是所有調度員的工作都在你的應用程序關閉之前就已經被磨掉了。在你的循環中放置睡眠語句1秒,然後將線程更改爲後臺線程應該工作。 – RandomEngy