Я не могу убить свою нить на C#. Кажется, что программа застревает в бесконечном цикле события FormClosing.Прекращение/соединение нити в C#
EDIT // Я пытаюсь закончить поток и закрыть всю программу при запуске события FormClosing.
Вот код:
public partial class Form1 : Form
{
private Thread thread;
private volatile bool threadRunning = true;
public Form1()
{
InitializeComponent();
}
private void Loop()
{
Console.WriteLine(threadRunning);
while (threadRunning)
{
MethodInvoker mi = delegate { timeLabel.Text = TimeWriterSingleton.Instance.OutputTime(); };
Invoke(mi);
}
}
private void Form1_Load(object sender, EventArgs e)
{
thread = new Thread(Loop);
thread.Start();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
threadRunning = false;
thread.Join();
}
}
Просто не делайте этого.Если вы хотите, чтобы некоторый элемент пользовательского интерфейса был обновлен в будущем, ** сделайте таймер **, и когда отметит таймер, обновите элемент. –
Winforms и WPF не являются потокобезопасными !, поэтому НИКОГДА не вызывайте их из любого потока, кроме потока, который запускает цикл сообщений. –
См. Также, например. https://stackoverflow.com/questions/17575673/thread-join-causing-deadlock, https://stackoverflow.com/questions/12502229/asynchronously-raised-events-which-use-invoke-causing-problems-with- multithreadi и https://stackoverflow.com/questions/24211934/deadlock-when-thread-uses-dispatcher-and-the-main-thread-is-waiting-for-thread-t (последний из них касается WPF, но основная проблема и понятия идентичны). –