我有一个带有以下(骨架)代码的WinForms应用程序:
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。想法?
答案 0 :(得分:3)
Thread.Sleep
在gui(主)线程(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