У меня есть главное окно 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
Как я могу автоматически выйти из потока, когда главное окно закрывается, а затем выходит из приложения?