Member 12069642 Ответов: 1

Как запустить индикатор выполнения непрерывно до тех пор, пока DLL не будет правильно загружена.


Привет ,
Я борюсь с этим вопросом уже три дня.
Я использую индикатор выполнения в окне всплеска. Этот индикатор выполнения работает правильно, если я ставлю задачу await.Задержка (1000)через одну секунду моя dll будет загружаться, потому что программа ждет завершения времени задержки. Через 1 секунду мой индикатор выполнения остановился, и моя dll начала загружаться.Это делает программу ленивой и занимает много времени для загрузки приложения
я хочу, чтобы оба работали одновременно . Мой индикатор прогресса должен работать непрерывно и
Моя библиотека dll должна работать на заднем плане. После этого откроется окно входа в систему, поэтому, пожалуйста, помогите мне
Ниже приведен мой код
Я создал индикатор выполнения в Xaml.

&ЛТ;минимальная компонента ProgressBar="0" максимальное="100" высота="10" фон="прозрачный" ширина="100" изображения="черный" имя="pbStatus" IsIndeterminate="true" в сетку.Столбец=" 1 "Поле =" 4,29,-4,20 " />


Мое Окно-Заставку Код В Приложение.Язык XAML.в CS
var splashScreen = new SplashWindow();
            //this.MainWindow = splashScreen;
            //this.MainWindow.Close();
            splashScreen.Show();
           // System.Threading.Thread th = new System.Threading.Thread();
            //in order to ensure the UI stays responsive, we need to
            //do the work on a different thread
            Task.Factory.StartNew(() =>
            {
                //simulate some work being done
                System.Threading.Thread.Sleep(5000);

                //since we're not on the UI thread
                //once we're done we need to use the Dispatcher
                //to create and show the main window
                this.Dispatcher.Invoke(() =>
                {
                    //initialize the main window, set it as the application main window
                    //and close the splash screen
                    var mainWindow = new Views.Common.LogIn();
                    this.MainWindow = mainWindow;
                        mainWindow.Show();
                    splashScreen.Close();
                });
            });



Как я могу прийти с этим вопросом

Что я уже пробовал:

this.Dispatcher.Invoke(() =>
                {
                    //initialize the main window, set it as the application main window
                    //and close the splash screen
                    var mainWindow = new Views.Common.LogIn();
                    this.MainWindow = mainWindow;
                        mainWindow.Show();
                    splashScreen.Close();
                });
            });


<pre>Task.Run(() =>
        {
             var mainWindow = new Views.Common.LogIn();
                    this.MainWindow = mainWindow;
                        mainWindow.Show();
                    splashScreen.Close();
        }

1 Ответов

Рейтинг:
1

Graeme_Grant

Эта статья в журнале MSDN покажет вам, как делать то, что вы хотите: Асинхронное программирование - асинхронность с самого начала[^]

ОБНОВЛЕНИЕ: В своих комментариях ниже вы указываете, что пользовательский интерфейс по-прежнему заблокирован. Обычно это происходит потому, что вы пытаетесь слишком много работать в потоке пользовательского интерфейса при запуске.

Многопоточность не так проста, если вы не знакомы с тем, как она работает, SynchronizationContext и UI message pump. Это подробно объясняется в статье. Работайте с загружаемым образцом кода и изменяйте его до тех пор, пока не поймете, а затем измените код в своем приложении.


Member 12069642

Я попробовал это сделать, и в данном Url-адресе они обсуждают оконную форму, и я работаю над WPF. Если я использую другое решение или запускаю два потока одновременно то возникает исключение вызывающий поток не может получить доступ к этому объекту потому что им владеет другой поток

Graeme_Grant

Продолжайте читать, и Winform, и WPF покрыты. 3-й абзац:

"Я собираюсь показать вам в ходе нескольких рефакторингов кода запуска пользовательского интерфейса по умолчанию, как для Windows Forms, так и для Windows Presentation Foundation (WPF), трансформируя шаблон пользовательского интерфейса в объектно-ориентированный дизайн и добавляя поддержку async/await."

В верхней части страницы также есть ссылки на скачивание образцов исходного кода C# и VB, так что вы можете попробовать этот код и добавить его в свой проект.

Member 12069642

Не могли бы вы сказать мне в моем коде, где я могу изменить и выполнить свою задачу

Graeme_Grant

Заставка, используемая в статье, - это просто еще одна форма. Поместите неопределенный прогрессбар на форму, и он будет делать то, что вы хотите.

Member 12069642

Я сделал неопределенный как вы можете видеть в моем коде но он был остановлен через несколько раз

Graeme_Grant

Совершенно хорошее решение только потому, что вы не понимаете, что вы делаете с многопоточностью или как работает код в статье, не очень хорошо, если вы хотите получить дополнительную помощь от меня или других.

Я использую код в статье в коммерческих приложениях, и он отлично работает. Вероятно, вы запускаете слишком много кода при запуске в потоке пользовательского интерфейса и душите насос сообщений пользовательского интерфейса, вызывая блокировку пользовательского интерфейса.

Перечитайте статью медленно и внимательно. Все ключи к решению вашей проблемы подробно описаны в этой статье.