При вимиканні програми не всі вікна закриваються

У мене є додаток, де створюється нове вікно для моєї графіки. Я створюю його наступним чином:

var thread = new Thread(() =>
{
    var win = new MyWindow();
    win.Show();
    Dispatcher.Run();
});

thread.SetApartmentState(ApartmentState.STA);
thread.Start();

Проблема в тому, що коли я закриваю Main application, додаткове вікно все ще включено, і мені потрібно закрити його вручну. Я встановлюю ShutDownMode у моєму App.xaml для OnMainWindowClose і перевизначено OnClosed :

protected override void OnClosed(EventArgs e)
{
    base.OnClosed(e);
    Application.Current.Shutdown();
}

Але це мені не допомагає.

0
@AhmedKRAIEM - це спосіб переконатися, що програма зупиниться, але це жорстокий спосіб, а не найчистіший спосіб.
додано Автор Max, джерело
@AhmedKRAIEM, хоча це правильна відповідь :)
додано Автор Max, джерело
Спробуйте Environment.Exit (0); або Process.GetCurrentProcess ().
додано Автор Ahmed KRAIEM, джерело
@Sasha, оскільки ви створюєте вікно на новому потоці, тепер воно не залежить від викликає програми. Переглянути відповідь ...
додано Автор Rikalous, джерело
@Sasha, оскільки ви створюєте вікно на новому потоці, тепер воно не залежить від викликає програми. Переглянути відповідь ...
додано Автор Rikalous, джерело
@Sasha, оскільки ви створюєте вікно на новому потоці, тепер воно не залежить від викликає програми. Переглянути відповідь ...
додано Автор Rikalous, джерело
Але ... чому ви робите це таким чином? Ви фактично створюєте нову програму, роблячи це. Це дійсно те, що ви хочете досягти?
додано Автор Rikalous, джерело
Але ... чому ви робите це таким чином? Ви фактично створюєте нову програму, роблячи це. Це дійсно те, що ви хочете досягти?
додано Автор Rikalous, джерело
Вам потрібна квартира? Чи не відповідає він за цю поведінку?
додано Автор C4stor, джерело
@Rikalous, що ви маєте на увазі під назвою "Ви ефективно створюєте нову програму, роблячи це"? Хіба це не просто нове вікно? Чому я створюю нову програму?
додано Автор Sasha, джерело
@Rikalous, що ви маєте на увазі під назвою "Ви ефективно створюєте нову програму, роблячи це"? Хіба це не просто нове вікно? Чому я створюю нову програму?
додано Автор Sasha, джерело

8 Відповіді

Додати

thread.IsBackground = true;

перед запуском потоку.

Refer to http://msdn.microsoft.com/en-us/library/ms741870.aspx

4
додано
@ C4stor Фоновий потік не перешкоджає вимкненню процесу.
додано Автор Bill Zhang, джерело
Чи може хтось пояснити, що тут відбувається?
додано Автор C4stor, джерело
Thnx, що вирішило проблему
додано Автор Sasha, джерело

Переконайтеся, що ваш потік зупинено, перш ніж програма закінчить роботу. Ви могли б зробити це, використовуючи Thread.Abort або дочекатися його використання Thread.Join.

Але це неприємні способи закінчити або чекати нитки. Найкращим способом є використання bool, щоб зупинити його роботу.

Here is how to stop your thread the "Clean" way: https://stackoverflow.com/a/10664959/1661209

2
додано
Немає проблем, радий почути ваше запитання вирішене :)
додано Автор Max, джерело
Дякуємо вам за відповідь, але також допомагає встановлення загрози.IsBackground = true)
додано Автор Sasha, джерело

Переконайтеся, що ваш потік зупинено, перш ніж програма закінчить роботу. Ви могли б зробити це, використовуючи Thread.Abort або дочекатися його використання Thread.Join.

Але це неприємні способи закінчити або чекати нитки. Найкращим способом є використання bool, щоб зупинити його роботу.

Here is how to stop your thread the "Clean" way: https://stackoverflow.com/a/10664959/1661209

2
додано
Немає проблем, радий почути ваше запитання вирішене :)
додано Автор Max, джерело
Дякуємо вам за відповідь, але також допомагає встановлення загрози.IsBackground = true)
додано Автор Sasha, джерело

Переконайтеся, що ваш потік зупинено, перш ніж програма закінчить роботу. Ви могли б зробити це, використовуючи Thread.Abort або дочекатися його використання Thread.Join.

Але це неприємні способи закінчити або чекати нитки. Найкращим способом є використання bool, щоб зупинити його роботу.

Here is how to stop your thread the "Clean" way: https://stackoverflow.com/a/10664959/1661209

2
додано
Немає проблем, радий почути ваше запитання вирішене :)
додано Автор Max, джерело
Дякуємо вам за відповідь, але також допомагає встановлення загрози.IsBackground = true)
додано Автор Sasha, джерело

Якщо ви хочете встановити зв'язок між вікнами, ви повинні встановити властивість власника нового вікна таким чином:

var childWindow = new ChildWindow();
childWindow.Owner = this;
childWindow.Show();

Тепер, якщо ви закриєте головне вікно, всі його діти закриються.

2
додано
Добре, дякую вам за пояснення
додано Автор Sasha, джерело

Якщо ви хочете встановити зв'язок між вікнами, ви повинні встановити властивість власника нового вікна таким чином:

var childWindow = new ChildWindow();
childWindow.Owner = this;
childWindow.Show();

Тепер, якщо ви закриєте головне вікно, всі його діти закриються.

2
додано
Добре, дякую вам за пояснення
додано Автор Sasha, джерело

Якщо ви хочете встановити зв'язок між вікнами, ви повинні встановити властивість власника нового вікна таким чином:

var childWindow = new ChildWindow();
childWindow.Owner = this;
childWindow.Show();

Тепер, якщо ви закриєте головне вікно, всі його діти закриються.

2
додано
Добре, дякую вам за пояснення
додано Автор Sasha, джерело

Зберігайте посилання на потік, який ви породили, і при виході з програми, ви сигналізуєте нитку, щоб вийти деяким чином (можливо через .manualresetevent.aspx "rel =" nofollow "> ManualResetEvent ). Після цього потрібно почекати, поки потік вийде, приєднавшись до нього.

_thread.Join();
1
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug

ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram