Мне нужно выполнить асинхронную операцию, когда окно закрыто (в основном, чтобы сохранить все мои данные). Проблема в том, что программа и поток пользовательского интерфейса умирают слишком рано, и задача никогда не выполняется. < /P>
Это пример кода: < /p>
public partial class MainWindow : Window
{
public MainWindow()
{
Closed += MainWindow_Closed;
_items = new(Enumerable.Range(0,10));
}
private ObservableCollection _items;
private async void MainWindow_Closed(object? sender, EventArgs e)
{
await LongTask();
}
private async Task LongTask()
{
await Task.Run(() =>
{
Trace.WriteLine("LongTask Start");
Application.Current.Dispatcher.BeginInvoke(() =>
{
// do some action in the UI thread
_items.Clear();
Trace.WriteLine("Cleared elements");
});
Thread.Sleep(5000);
Trace.WriteLine("LongTask End");
});
}
}
< /code>
и выход консоли никогда не печатает «очищенные элементы» и «Longtask End».
Я также поместил действие в задачу Async, которая нуждается в потоке пользовательского интерфейса, чтобы завершить операцию , который необходим в моем варианте использования. (Таким образом, нельзя использовать longtask (). Getawaiter (). GetResult () в основном потоке, поскольку это приведет к тупику).
Спасибо за помощь !!
Подробнее здесь: https://stackoverflow.com/questions/794 ... ndow-close
WPF: асинхронная работа в окне закрывается ⇐ C#
Место общения программистов C#
-
Anonymous
1738450892
Anonymous
Мне нужно выполнить асинхронную операцию, когда окно закрыто (в основном, чтобы сохранить все мои данные). Проблема в том, что программа и поток пользовательского интерфейса умирают слишком рано, и задача никогда не выполняется. < /P>
Это пример кода: < /p>
public partial class MainWindow : Window
{
public MainWindow()
{
Closed += MainWindow_Closed;
_items = new(Enumerable.Range(0,10));
}
private ObservableCollection _items;
private async void MainWindow_Closed(object? sender, EventArgs e)
{
await LongTask();
}
private async Task LongTask()
{
await Task.Run(() =>
{
Trace.WriteLine("LongTask Start");
Application.Current.Dispatcher.BeginInvoke(() =>
{
// do some action in the UI thread
_items.Clear();
Trace.WriteLine("Cleared elements");
});
Thread.Sleep(5000);
Trace.WriteLine("LongTask End");
});
}
}
< /code>
и выход консоли никогда не печатает «очищенные элементы» и «Longtask End».
Я также поместил действие в задачу Async, которая нуждается в потоке пользовательского интерфейса, чтобы завершить операцию , который необходим в моем варианте использования. (Таким образом, нельзя использовать longtask (). Getawaiter (). GetResult () в основном потоке, поскольку это приведет к тупику).
Спасибо за помощь !!
Подробнее здесь: [url]https://stackoverflow.com/questions/79405381/wpf-asynchronous-operation-on-window-close[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия