Member 14734054 Ответов: 2

Windows forms зависает при нажатии кнопки большую часть времени


I am working on a windows application which freezes most of the time on button click events on Home Page. Please find the code below for your reference. Thanks


using System;
using System.Windows.Forms;

namespace FileMigrationAgen
{
    public partial class HomePage : Form
    {
        public HomePage()
        {
            InitializeComponent();
        }

        private void tableLayoutPanel4_Paint(object sender, PaintEventArgs e)
        {

        }

        private async void button1_Click(object sender, EventArgs e)
        {
            SharepointMigration sharepointMigration = new SharepointMigration();
            sharepointMigration.Show();
            this.Hide();
            }

        private async void button2_Click(object sender, EventArgs e)
        {
            OneDriveMigration oneDriveMigration = new OneDriveMigration();
            oneDriveMigration.Show();
            this.Hide();            
        }


        private void HomePage_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }
    }
}


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

Попробовал добавить закрытое событие формы в случае, если потоки не были утилизированы должным образом, но это не помогло.

Richard Deeming

Почему методы обработчика событий button-click помечены как async- Помимо того, что ты должен это сделать. избегайте асинхронных методов void[^], нет никаких await высказывания в любом из них, так что async модификатор не служит никакой цели.

2 Ответов

Рейтинг:
5

mreinslc

Более чем вероятно, что "работа", выполняемая внутри конструктора для объекта SharepointMigration или метода during the Show, занимает много ресурсов. Приложение зависает, потому что работа выполняется в основном потоке пользовательского интерфейса. Вы должны разделить работу на две части - ту, которая может быть запущена в отдельном потоке (не требует пользовательского интерфейса), и ту, которая потребует пользовательского интерфейса. Попробовать это. Измените события нажатия кнопки на аналогичный шаблон, как показано ниже:

Во-первых, создайте метод расширения, чтобы помочь, как описано здесь: C# - UIthread-Invoke Backgroundworker


private async void button1_Click(object sender, EventArgs e)
{
	//Make the constructor simple and not time consuming, 
	//only initialize variables with basic values
	//You can do the "work" in a seperate method that 
	//will be called  after the form is constructed.
	//To work correctly, the main UI thread needs 
	//to create/construct the form.
    SharepointMigration sharepointMigration = new SharepointMigration();
    
    //using async here because your button signature in 
    //your post used async. If the method does not need 
    //to be async then remove async and the await operator.  
    //The ContinueWith allows the form to show when the 
    //worker task - sharepointMigration.InitializeForm()
    //completes
    await Task.Run(async() => 
await sharepointMigration.InitializeForm()).ContinueWith((x) => {   

    	//Note the use of the extension method which 
    	//ensures the code executes on the Main UI Thread
    	sharepointMigration.UIThreadInvoke(() => {
    	
		    sharepointMigration.Show();
		    this.Hide();
	    });
    });
}


Рейтинг:
1

OriginalGriff

Мы понятия не имеем, что делают ваши формы, но есть один поток пользовательского интерфейса, который является общим для всех форм (и элементов управления), поэтому, если ваши новые конструкторы форм или обработчики событий загрузки / отображения занимают значительное время, то основная форма, скорее всего, "зависнет" до тех пор, пока они не будут закончены.

Начните с просмотра конструкторов и обработчиков событий запуска форм и посмотрите, делают ли они что-нибудь, что можно выгрузить в фоновый поток: помните, что основная форма не будет "скрываться" до тех пор, пока конструктор и метод Show не вернутся.


Member 14734054

Да, ваше предложение действительно помогло мне в некотором роде, поэтому я добавил showed() во всех формах. Теперь, когда я перехожу к другим формам с домашней страницы, он работает нормально.

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

OriginalGriff

Мы не можем сказать вам: "сделайте это, и это будет исправлено", потому что у нас нет доступа к вашему коду или вашему приложению во время его работы. Вам нужно посмотреть, что делает ваш код, и выяснить, где он "занят" - и мы не можем сделать это за вас!

Member 14734054

Конечно. Спасибо за ваш ответ.