c # EventArrivedEventHandler застрял в бесконечном цикле, не может ссылаться на наблюдателя - PullRequest
0 голосов
/ 04 сентября 2011

Я погуглил эту проблему на прошлой неделе, это убивает мой покой!Пожалуйста, помогите ... EventArrivedEventHandler застрял в цикле, и если я остановлю его, он не будет перехватывать события.Но когда я использую метод-обработчик, поток все еще концентрируется на цикле и не будет обращать внимания на новую форму, которую я пытаюсь создать в обработчике!Странно то, что если я просто использую что-то маленькое, например MessageBox, это не вызывает проблем, просто попытка создать экземпляр формы приводит к тому, что кнопки НЕ рисуются.Затем вскоре после того, как программа перестает отвечать.Если вам интересно, где находится код формы, это просто стандартная форма, созданная .NET, которая работает везде в коде, кроме обработчика событий.

Спасибо!

class MainClass
{
    public static void Main()
    {
        TaskIcon taskbarIcon;
        EventWatch myWatcher;

        taskbarIcon = new TaskIcon();
        taskbarIcon.Show();

        myWatcher = new EventWatch();
        myWatcher.Start();

        Application.Run();
    }
}

public class TaskIcon
{
    public void Show()
    {
        NotifyIcon notifyIcon1 = new NotifyIcon();
        ContextMenu contextMenu1 = new ContextMenu();
        MenuItem menuItem1 = new MenuItem();
        MenuItem menuItem2 = new MenuItem();

        contextMenu1.MenuItems.AddRange(new MenuItem[] { menuItem1, menuItem2 });

        menuItem1.Index = 0;
        menuItem1.Text = "Settings";
        menuItem1.Click += new EventHandler(notifyIconClickSettings);

        menuItem2.Index = 1;
        menuItem2.Text = "Exit";
        menuItem2.Click += new EventHandler(notifyIconClickExit);

        notifyIcon1.Icon = new Icon("app.ico");
        notifyIcon1.Text = "Print Andy";
        notifyIcon1.ContextMenu = contextMenu1;
        notifyIcon1.Visible = true;
    }

    private static void notifyIconClickSettings(object Sender, EventArgs e)
    {
        MessageBox.Show("Settings Here");
    }

    private static void notifyIconClickExit(object Sender, EventArgs e)
    {
        //taskbarIcon.Visible = false; // BONUS QUESTION: Why can't I hide the tray icon before exiting?

        Application.Exit();
    }
}

public class EventWatch
{
    public void Start()
    {
        string thisUser = WindowsIdentity.GetCurrent().Name.Split('\\')[1];

        WqlEventQuery query = new WqlEventQuery();

        query.EventClassName = "__InstanceCreationEvent";
        query.Condition = @"TargetInstance ISA 'Win32_PrintJob'";
        query.WithinInterval = new TimeSpan(0, 0, 0, 0, 1);

        ManagementScope scope = new ManagementScope("root\\CIMV2");
        scope.Options.EnablePrivileges = true;

        ManagementEventWatcher watcher = new ManagementEventWatcher(scope, query);

        watcher.EventArrived += new EventArrivedEventHandler(showPrintingForm);

        watcher.Start();
    }
    void showPrintingForm(object sender, EventArrivedEventArgs e)
    {
        // MessageBox.Show("This will draw just fine");

        Form1 myForm;
        myForm = new Form1();
        myForm.Show(); // This causes a hangup
    }
}

1 Ответ

0 голосов
/ 04 сентября 2011

Я думаю, что ManagementEventWatcher вызывает обработчик EventArrived из потока, отличного от потока пользовательского интерфейса.Затем ваш showPrintingForm выполняется в этом потоке, и доступ к пользовательскому интерфейсу из потока, отличного от потока пользовательского интерфейса, является плохим.Вам необходимо перенести код обратно в поток пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...