[英]BackgroundWorker blocking NotifyIcon's ContextMenu
我有一個帶有以下(骨架)代碼的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。 有什么想法嗎?
由於您已讀取BGW的方式,因此在gui(主)線程( http://msdn.microsoft.com/zh-cn/library/ms171728.aspx )上執行Thread.Sleep
您應該使用Timer而不是Thread睡眠5分鍾。
計時器類別: http : //msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.