Значок уведомления не отображается в трее C # winforms - PullRequest
1 голос
/ 18 августа 2011

почему мой значок уведомления не отображается в системном трее при запуске формы Windows?
Вот что я делаю.
У меня есть служба Windows, которая запускает мое приложение в трее, которое является приложением формы Windows (я использую олицетворение для запуска этого приложения в контексте текущего пользователя). В приложении трей я запускаю форму, которая содержит значок уведомления.
Проблема здесь в том, что значок уведомления иногда не появляется в системном трее, и я не могу выяснить, почему.
В методе OnLoad формы я устанавливаю для свойства visible значение false. Также я делаю некоторые удаленные вызовы службы (например, IPC). Это проблема?
Как сделать так, чтобы значок уведомления всегда отображался в системном трее?
РЕДАКТИРОВАТЬ: Вот код для функции OnLoad

protected override void OnLoad(System.EventArgs e)
{
    this.Visible = false;
    //Get some value from registry
    CheckForStealthMode();
    GetLoginType();
    bool GetProbeStatus = false;
    ServiceActivityInterface remoteMethods = null;
    do
    {
        try
        {
            remoteMethods = (ServiceActivityInterface)Activator.GetObject(typeof(ServiceActivityInterface), "tcp://localhost:18800/ServiceRemoting);
            ProbeStatus = remoteMethods.GetProbeStatus();
            GetProbeStatus = true;
        }
        catch (Exception exception)
        {
            GetProbeStatus = false;
            log.Error("Exception while getting the status of Probe:" + exception.Message);
        }
        finally
        {
            remoteMethods = null;
            if (!GetProbeStatus) 
            {
                Thread.Sleep(5000);
                log.Debug("Retrying to get the probe status.");
            }
        }
    } while (!GetProbeStatus);  
}

Ответы [ 2 ]

0 голосов
/ 19 августа 2011

Рассматривая ваш метод OnLoad, вы получаете потенциально бесконечный цикл, который может выполняться только один раз каждые 5 секунд, если есть какое-либо исключение, за исключением того, что исключение регистрируется, а затем выбрасывается.Когда вы Thread.Sleep блокируете поток пользовательского интерфейса и, скорее всего, не отображаете значок уведомления.Я хотел бы взглянуть на вызовы Activator.GetObject или RPC GetProbeStatus и рассмотреть возможность перемещения кода RPC в другой поток, чтобы избежать блокировки пользовательского интерфейса.

0 голосов
/ 18 августа 2011

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

. Я бы также предположил (и это может решить вашу проблему, если она связана с методом Thread.Sleep, чтоидеально. Пользователь просто получает замороженный интерфейс. Используйте один из классов таймера и выберите тик или прошедшее событие, чтобы пользователь мог продолжить, но вы все равно получаете задержку после.

...