Вопрос

I have a WinForms app with the following (skeleton) code:

namespace MyTrayApp
{
    public class SysTrayApp : Form
    {
        [STAThread]
        public static void Main()
        {
            try
            {
                SysTrayApp app = new SysTrayApp();
                Application.Run();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private NotifyIcon _trayIcon;
        private ContextMenu _trayMenu;

        private BackgroundWorker _bw = new BackgroundWorker();

        public SysTrayApp()
        {
            _trayMenu = new ContextMenu();
            _trayMenu.MenuItems.Add("Exit", OnExit);

            _trayIcon = new NotifyIcon();
            _trayIcon.Icon = new Icon(SystemIcons.Asterisk, 40, 40);

            _trayIcon.ContextMenu = _trayMenu;
            _trayIcon.Visible = true;

            _bw.WorkerReportsProgress = false;
            _bw.WorkerSupportsCancellation = true;
            _bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            _bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            _bw.RunWorkerAsync();
        }

        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
        // do stuff
        }

        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
            return;
            }
            Thread.Sleep(TimeSpan.FromMinutes(5)); // wait 5 minutes...
            _bw.RunWorkerAsync(); // then run again
        }
    }
}

The problem is that I can only right-click to open the ContextMenu when the app starts up. It seems that once the BackgroundWorker starts sleeping, it somehow blocks the ContextMenu. Thoughts?

Это было полезно?

Решение

Thread.Sleep is executed on the gui(main) thread (http://msdn.microsoft.com/en-us/library/ms171728.aspx) due to the way you've cread the BGW You should use a Timer instead Thread.Sleep 5 minutes.

Timer Class: http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top