Доступ к объекту, созданному в новом потоке - PullRequest
1 голос
/ 07 декабря 2011

У меня есть приложение, которое запускает новый поток, чтобы показать значок панели задач.Теперь я просто не могу понять, как я могу вызвать TaskbarIcon (он создается в новом потоке) из моего основного потока, чтобы показать всплывающую подсказку.

Код, который у меня сейчас есть:

public class NotificationHelper
{
    private TaskbarIcon notifyIcon { get; set; }

    public NotificationHelper()
    {
        Thread thread = new Thread(OnLoad);
        thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
        thread.Start();
    }

    public void ShowNotification(string text)
    {
        notifyIcon.ShowBalloonTip("Demo", text, notifyIcon.Icon);
    }

    public void OnLoad()
    {
        notifyIcon = new TaskbarIcon();
        notifyIcon.Icon =
            new Icon(@".\Icon\super-man-icon.ico");
        //notifyIcon.ToolTipText = "Left-click to open popup";
        notifyIcon.Visibility = Visibility.Visible;

        while (true)
        {
            Thread.Sleep(1000);
        }
    }

    private void ShowBalloon()
    {
        notifyIcon.ShowBalloonTip("Demo", Message, notifyIcon.Icon);
    }
}

И когда я пытаюсь вызвать 'ShowNotification ("foobar");'Я получаю это исключение:

Object reference not set to an instance of an object.

Причина, по которой у меня есть 'while (true) {}' в 'Onload ()', заключается в том, что мне нужно, чтобы поток работал, пока я не закрою свое приложение.

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

В вашей основной теме создайте диспетчер с:

Dispatcher dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher;

Передайте его в NotificationHelper:

Dispatcher FDispatcher;

public NotificationHelper(Dispatcher ADispatcher)
{
     FDispatcher = ADispatcher;
     //...
}

Показать всплывающее окно:

private void ShowBalloon()
{
    FDispatcher.invoke(new Action(() => {
        notifyIcon.ShowBalloonTip("Demo", Message, notifyIcon.Icon);
    }));
}
0 голосов
/ 07 декабря 2011

Вы можете попробовать заблокировать notifyIcon и проверить на ноль следующим образом:

public class NotificationHelper 
{
    private readonly object notifyIconLock = new object();
    private TaskbarIcon notifyIcon { get; set; }      

    public NotificationHelper()     
    {         
        Thread thread = new Thread(OnLoad);         
        thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA         
        thread.Start();
    }

    public void ShowNotification(string text)
    {
        lock (notifyIconLock)
        {
            if (notifyIcon != null)
            {
                notifyIcon.ShowBalloonTip("Demo", text, notifyIcon.Icon);
            }
        }
    }

    public void OnLoad()
    {
        lock (notifyIconLock)
        {
            notifyIcon = new TaskbarIcon();
            notifyIcon.Icon =
                new Icon(@".\Icon\super-man-icon.ico");
            //notifyIcon.ToolTipText = "Left-click to open popup";
            notifyIcon.Visibility = Visibility.Visible;
        }
    }

    private void ShowBalloon()
    {
        lock (notifyIconLock)
        {
            if (notifyIcon != null)
            {
                notifyIcon.ShowBalloonTip("Demo", Message, notifyIcon.Icon);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...