2013-08-13 5 views
0

У меня есть приложение WinForms со следующим (скелетной) Код:BackgroundWorker блокировки NotifyIcon в ContextMenu

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 
     } 
    } 
} 

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

+2

Помещенный заявление Thread.sleep в функции DoWork. Это функция, выполняемая в фоновом потоке. – ZippyV

+0

Это сработает, и я считаю, что это правильный ответ. – kevlar1818

+0

Чего вы на самом деле хотите достичь? Вы хотите выполнить что-то в фоновом режиме каждые 5 минут или вы хотите временно использовать 'Thread.Sleep' для работы _simulate_? – ZippyV

ответ

3

Thread.Sleep выполнен на линии gui (main) (http://msdn.microsoft.com/en-us/library/ms171728.aspx) из-за способа, которым вы создали BGW. Вместо этого вы должны использовать Timer вместо Thread.Sleep 5 минут.

Таймер Класс: http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx

+2

Разве это не похоже на вопрос? –

+0

Я мог бы написать первые части как комментарий, второй как ответ, я действительно объединил его. –

+0

Убедите меня, что «Сон» выполняется в потоке графического интерфейса пользователя, и у вас есть как минимум верхняя часть. – kevlar1818

Смежные вопросы