Witam. Jako w dalszym ciągu początkujący programista wróciłem do starego projektu, z którym i tak sporo się męczyłem. Moim celem było utworzenie aplikacji dokowanej w tray'u, która wysunie formatkę po kliknięciu w ikonę. Udało się to w końcu zrobić, lecz tym razem problem polega na tym, że przy wysuwaniu formatki strasznie długo się zastanawia (Może koło 15 sekund). Ten problem pojawia się tylko przy wysuwaniu formy, podczas chowania jej reaguje od razu mimo tego, że obsługuje te czynności identyczny mechanizm. Zdaję sobie sprawę, że w kodzie może jest mały bałagan, ale czy może to tak oddziaływać na aplikację?

Dla pewności wstawię większy fragment kodu, może któryś z moich pomysłów okazał się mało wydajny lub szkodliwy:

public partial class TrayForm : Form
    {
        private NotifyIcon notifyIcon;
        private ContextMenu contexMenu;

        AppForm appform = new AppForm();
        AppForm _frm = null;

        int x, y;

        public TrayForm()
        {

            InitializeComponent();

            notifyIcon = new NotifyIcon();
            contexMenu = new ContextMenu();

            contexMenu.MenuItems.Add("exit", OnExit);

            notifyIcon.Text = "TrayApp";
            notifyIcon.Icon = new Icon(SystemIcons.Application, 40, 40);
            notifyIcon.ContextMenu = contexMenu;
            notifyIcon.Visible = true;

            notifyIcon.DoubleClick += new EventHandler(notifyIcon_DoubleClick);
        }

        private void notifyIcon_DoubleClick(object sender, EventArgs e)
        {
            //appform.ShowDialog();     

            _frm = new AppForm();
            _frm.StartPosition = FormStartPosition.Manual;
            x = Screen.PrimaryScreen.Bounds.Width - _frm.Width;
            y = Screen.PrimaryScreen.Bounds.Height;
            _frm.Location = new Point(x, y);
            this.TopMost = true;
            _frm.Show();

            timer1.Start();
        }

        private void OnExit(object sender, EventArgs e)
        {
            Close();
        }

        private void TrayForm_Load(object sender, EventArgs e)
        {
            Visible = false;
            ShowInTaskbar = false;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Stop();

            _frm.Location = new Point(_frm.Location.X, _frm.Location.Y - 5);

            if (_frm.Location.Y <= Screen.PrimaryScreen.Bounds.Height - _frm.Height)
            {
                this.TopMost = false;
                _frm.BringToFront();
                _frm.Focus();
            }
            else
                timer1.Start();

        }

    }