У меня есть приложение 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. Мысли?
Помещенный заявление Thread.sleep в функции DoWork. Это функция, выполняемая в фоновом потоке. – ZippyV
Это сработает, и я считаю, что это правильный ответ. – kevlar1818
Чего вы на самом деле хотите достичь? Вы хотите выполнить что-то в фоновом режиме каждые 5 минут или вы хотите временно использовать 'Thread.Sleep' для работы _simulate_? – ZippyV