Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209

WPF vs WinForms

18.06.2018, 20:25. Показов 1762. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Дело обстоит так:
Писал программу на WinForms, но из-за тормознуточти datagridview перекидываю проект (работа с локальной базой данной access) на WPF и работаю с ним (WPF) первый раз и сразу несколько вопросов:
1. Почему WPF всегда так долго собирается?
2. Иногда вторая форма запускается/открывается с задержкой, хоть на форме имеется только текстбокс и кнопка и никаких операций при запуске не производится, кроме как подключения к БД. Пробовал на двух машинах, вторая мощная, но так же зависания есть.
3. Есть алгоритм проверки номера по порядку в бд, так же в winForms все работало быстро( суть метода в том, что он прогоняет значения int (порядковый номер) от начального до того момента, пока не найдет отсутствующего и присваивает ему номер, ниже код)
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 for (int n = MinNumberOrder; n <= MaxNumberOrder + 1; n++)
                {
                    if (n <= MaxNumberOrder)
                    {
                        string MaxNumber1 = "SELECT НомерИзвещения  FROM [" + OrderSet + "] WHERE [НомерИзвещения] ='" + n.ToString() + "'";
                        command = new OleDbCommand(MaxNumber1, conn);
                        if (command.ExecuteScalar() == null)
                        {
                            MessageBox.Show("New number ПМЖИ." + n.ToString());
 
                           
                            
                            string paste = "INSERT INTO [" + OrderSet + "] (Дата, ПИ, Обозначение, Наименование, Код, ПричинаИзменения, Фамилия, Телефон, НомерИзвещения, Отдел, UserName, PCname ) VALUES ('" 
                                + DateTime.Today.ToString() + "','" + AdvanceNotice+ "','" + Designation + "','" + Name +
                                "','" +ErrorCode+ "','" + ReasonsOfChange + "','" + Surename + "','" + PhoneNumber +
                                "','" + n.ToString() + "','" + Departament + "','" + Environment.UserName + "','" + Environment.MachineName + "')";
                            command = new OleDbCommand(paste, conn);
                            command.ExecuteNonQuery();
                            
                            break;
                        }
                    }
                    else
                    {
                        MessageBox.Show("Зарезервированных номеров не осталось. Пожалуйста, сообщите об этом по тел. 99-99 или 98-98");
                        string MaxNumber1 = "SELECT НомерИзвещения  FROM [" + OrderSet + "] WHERE [НомерИзвещения] ='" + MaxNumberOrder.ToString() + "'";
                        command = new OleDbCommand(MaxNumber1, conn);
 
                    }
                    
 
                 }

Так вот, в WinForms все работало без ошибок и номера выдавались правильно, а в WPF он как будто не успевает записать номер в БД и если подряд два раза запросить номер (с задержкой в пару секунд), то он выдает повторно номер. Как решить?

Пока что это несколько беспокоящих вопросов.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.06.2018, 20:25
Ответы с готовыми решениями:

WPF и компонент WinForms
Так как меня абсолютно неустроил встроеный браузер, я решил использовать двиг gecko.В WinForms все работает но как его добавить в WPF?

WPF TextBox из WinForms
из окна WinForms я хочу вызвать окно WPF: WinWPF win = new WinWPF(); win.Show(); окно корректно появляется, в нем определенным...

WinForms эволюция в WPF
Привет! Подскажите пожалуйста, правильно ли у меня сформировалось мнение или представление, что WPF является продолжением или эволюцией...

9
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
18.06.2018, 20:38
Цитата Сообщение от Felix Felicis Посмотреть сообщение
но из-за тормознуточти datagridview перекидываю проект (работа с локальной базой данной access) на WPF
В чем тормознутость заключается? Виртуальный режим пробовали?

Цитата Сообщение от Felix Felicis Посмотреть сообщение
1. Почему WPF всегда так долго собирается?
Долго это сколько? Компиляция C# обычно очень быстрая даже очень больших проектов.

Цитата Сообщение от Felix Felicis Посмотреть сообщение
2. Иногда вторая форма запускается/открывается с задержкой, хоть на форме имеется только текстбокс и кнопка и никаких операций при запуске не производится, кроме как подключения к БД. Пробовал на двух машинах, вторая мощная, но так же зависания есть.
Если подключение синхронное, то нет ничего удивительного что на время подключения возникает задержка.

Цитата Сообщение от Felix Felicis Посмотреть сообщение
3. Есть алгоритм проверки номера по порядку в бд, так же в winForms все работало быстро( суть метода в том, что он прогоняет значения int (порядковый номер) от начального до того момента, пока не найдет отсутствующего и присваивает ему номер, ниже код)
Алгоритм мягко говоря хреновый. Может стоит 1 раз запросить весь список и потом хранить в памяти?
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
18.06.2018, 22:20  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
В чем тормознутость заключается? Виртуальный режим пробовали?
Вроде да, пихал в DataSource. Проблема в отрисовке при скроллинге и при изменении размера окна, оно тормозит сильно.

Цитата Сообщение от Someone007 Посмотреть сообщение
Долго это сколько? Компиляция C# обычно очень быстрая даже очень больших проектов.
После начала "Сборки решения" (Я поменял текст в переменной string) прошло 40 секунд и приложение открылось.

Цитата Сообщение от Someone007 Посмотреть сообщение
Если подключение синхронное, то нет ничего удивительного что на время подключения возникает задержка.
А как решить данную проблему и почему на winForms такого нет?
Цитата Сообщение от Someone007 Посмотреть сообщение
Алгоритм мягко говоря хреновый. Может стоит 1 раз запросить весь список и потом хранить в памяти?
Возможно, но если обычный пользователь будет брать номера, а администратор в это время один номер освободит, то уже в сеанс программы освобожденный номер не будет занят. Так почему в итоге WPF медленней делает все? Или у него больше всяких настроек, чтобы плавно работало?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
18.06.2018, 22:35
Цитата Сообщение от Felix Felicis Посмотреть сообщение
1. Почему WPF всегда так долго собирается?
Ты ещё UWP не собирал, похоже, вот он действиетльно долго собирается. Понятно, что от размера проекта тоже зависит. Например, Unreal Engine у меня собрался с нуля 40 минут )), это вообще не относится к шарпу, но всё-таки решил упомянуть.

Цитата Сообщение от Felix Felicis Посмотреть сообщение
Так вот, в WinForms все работало без ошибок и номера выдавались правильно, а в WPF он как будто не успевает записать номер в БД и если подряд два раза запросить номер (с задержкой в пару секунд), то он выдает повторно номер. Как решить?
Да причём тут вообще WPF? Значит у тебя алгоритм твой с ошибками написан. Или ты в UI потоке обращения к БД делаешь?

Добавлено через 1 минуту
Цитата Сообщение от Felix Felicis Посмотреть сообщение
Проблема в отрисовке при скроллинге и при изменении размера окна, оно тормозит сильно.
Так ты к БД обращайся не из UI потока.
1
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
18.06.2018, 22:36  [ТС]
Цитата Сообщение от Casper-SC Посмотреть сообщение
Ты ещё UWP не собирал, похоже, вот он действиетльно долго собирается. Понятно, что от размера проекта тоже зависит. Например, Unreal Engine у меня собрался с нуля 40 минут )), это вообще не относится к шарпу, но всё-таки решил упомянуть.
Видел как 5 секунд видео рендерилось 3 суток) На хорошем компе)

Цитата Сообщение от Casper-SC Посмотреть сообщение
Или ты в UI потоке обращения к БД делаешь?
UI - имеется ввиду в главном (в моем случае и единственном) потоке?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
18.06.2018, 22:36
Цитата Сообщение от Felix Felicis Посмотреть сообщение
Возможно, но если обычный пользователь будет брать номера, а администратор в это время один номер освободит, то уже в сеанс программы освобожденный номер не будет занят.
С таким "подробным" объяснением советов можешь по поводу алгоритма не ждать .
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
18.06.2018, 22:38  [ТС]
Цитата Сообщение от Casper-SC Посмотреть сообщение
С таким "подробным" объяснением советов можешь по поводу алгоритма не ждать .
Подробнее мне легче показать и рассказать типа по скайпу, стараюсь тоже много не писать, а то получится муть какая-то)
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
18.06.2018, 22:38
Цитата Сообщение от Felix Felicis Посмотреть сообщение
Так почему в итоге WPF медленней делает все? Или у него больше всяких настроек, чтобы плавно работало?
Ну, скажем, WPF чуть тяжелее Windows Forms, но не настолько, чтобы пустые окна тормозили. Ща покажу пример, как можно сделать.
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
18.06.2018, 22:48  [ТС]
Цитата Сообщение от Casper-SC Посмотреть сообщение
Или ты в UI потоке обращения к БД делаешь?


Так ты к БД обращайся не из UI потока.
Даже если и так, то я же один раз обратился, вывел в таблицу все и потом просто скроллю

Если скину проект, то сможете посмотреть?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
19.06.2018, 08:50
Felix Felicis, могу

Добавлено через 5 минут
StartAsync() в классе MainViewModel и будет обращаться к твоей БД. Всё, что внутри _dispatcher.RunAsync это то, что будет обновлять свойства вью модели из UI потока. Это нужно, так как код внутри Task.Run работает в одном из потоков пула потоков, не в UI потоке то есть.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    public class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
 
        protected void RaisePropertyChanged<T>([CallerMemberName] string propertyName = null)
        {
            if (string.IsNullOrEmpty(propertyName))
                throw new ArgumentException("This method cannot be called with an empty string", nameof(propertyName));
 
            RaisePropertyChanged(propertyName);
        }
 
        protected bool Set<T>(ref T field, T newValue = default(T), [CallerMemberName] string propertyName = null)
        {
            if (EqualityComparer<T>.Default.Equals(field, newValue))
            {
                return false;
            }
 
            field = newValue;
            RaisePropertyChanged<T>(propertyName);
            return true;
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
    public interface IDispatcher
    {
        Task RunAsync(Action action);
    }
 
    public class DispatcherHelper : IDispatcher
    {
        public async Task RunAsync(Action action)
        {
            await Application.Current.Dispatcher.InvokeAsync(action);
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    public class MainViewModel : ViewModelBase
    {
        private readonly IDispatcher _dispatcher;
        private string _state;
 
        public string State
        {
            get => _state;
            set => Set(ref _state, value);
        }
 
        public MainViewModel(IDispatcher dispatcher)
        {
            _dispatcher = dispatcher;
            State = "Unset";
        }
 
        public async Task StartAsync()
        {
            await Task.Run(async () =>
            {
                for (int i = 0; i < 100; i++)
                {
                    await Task.Delay(1000);
 
                    int index = i;
 
                    await _dispatcher.RunAsync(() =>
                    {
                        State = index.ToString();
                    });
                }
            });
        }
    }
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:WpfApp2"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="800"
        Height="450"
        mc:Ignorable="d">
    <Grid>
 
        <TextBlock Margin="65,35,0,0"
                   HorizontalAlignment="Left"
                   VerticalAlignment="Top"
                   Text="{Binding State}"
                   TextWrapping="Wrap" />
 
    </Grid>
</Window>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Windows;
 
namespace WpfApp2
{
    public partial class MainWindow : Window
    {
        private readonly MainViewModel _mainViewModel;
 
        public MainWindow()
        {
            _mainViewModel = new MainViewModel(new DispatcherHelper());
            DataContext = _mainViewModel;
            Loaded += MainWindow_Loaded;
 
            InitializeComponent();
        }
 
        private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                await _mainViewModel.StartAsync();
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.Message);
            }
        }
    }
}
Добавлено через 47 минут
Felix Felicis, посмотрел код. Тормоза точно из-за того, что обращение к БД в UI потоке.

Добавлено через 1 минуту
Без самой БД я не очень хочу сидеть наугад без отладки делать пример, который будет выглядеть более-менее. Прога не большая, её за несколько часов можно сделать нормально работающей и код более-менее прилично написать.

Добавлено через 1 минуту
В общем, посмотрю ещё, может что-то набросаю. Если БД не супер секретная, то скинь лучше её. Пусть там будет инфы по минимуму, но главное, чтобы работало
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.06.2018, 08:50
Помогаю со студенческими работами здесь

Переход с WinForms на WPF
я перехожу с winforms на wpf....у меня весь проект построен на прорисовке линий в picturebox ....поэтому я и хочу его вставить форму,а не...

WPF вместе с WinForms
Здравствуйте! Есть WPF проект. Всё работает нормально. Но хотелось бы некоторые окна (например, окно настроек) сделать на WinForms. Можно...

Вызов формы WinForms из WPF
Короче форма вызывается нормально, но вот заметил она какая то без визуальных стилей штоль... Короче как включить эти самые визуальные...

WPF vs WinForms (для начинающих) [Элд Хасп]
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html Эту тему решил создать, так как очень часто сталкиваюсь с...

Переписать код C# с winForms на WPF
Есть программный код. Написан с использованием библиотек DirectX. На winForms все отлично работает, но необходимо переписать его под WPF. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru