0

I'm creating new thread, in this thread i'm creating new menuItem that i want to add in menu on main window, but i'm getting errors like this (The calling thread cannot access this object because a different thread owns it).

Thread tempT = new Thread(new ThreadStart(LoadPlugins));
        tempT.SetApartmentState(ApartmentState.STA);
        tempT.IsBackground = true;
        tempT.Start();

So in method "LoadPlugins" i'm creating new menuitem.

I tried to solve this error by:

 Main_Menu.Dispatcher.Invoke(new Action(() => { Main_Menu.Items.Add(Plugin_Menu); }), System.Windows.Threading.DispatcherPriority.ContextIdle);

 Dispatcher.BeginInvoke(new Action(() => { Main_Menu.Items.Add(Plugin_Menu); }), System.Windows.Threading.DispatcherPriority.ContextIdle);

Nothing work, hope for help ;D

 private void LoadPlugins()
    {
        MenuItem Plugin_Menu = new MenuItem();
        Plugin_Menu.Header = "Plugins";
        Plugin_Menu.Template = (ControlTemplate)FindResource("twMenuItem");

        plugins.Clear();

        DirectoryInfo pluginDirectory = new DirectoryInfo(pluginPath);

        if (!pluginDirectory.Exists)
        {
            pluginDirectory.Create();
        }

        var pluginFiles = Directory.GetFiles(pluginPath, "*.dll");

        foreach (var file in pluginFiles)
        {
            Assembly asm = Assembly.LoadFrom(file);

            var types = asm.GetTypes().
                        Where(t => t.GetInterfaces().
                        Where(i => i.FullName == typeof(IPlugin).FullName).Any());

            foreach (var type in types)
            {
                var plugin = asm.CreateInstance(type.FullName) as IPlugin;
                plugins.Add(plugin);
            }
        }

        foreach(IPlugin plugin in plugins)
        {

            MenuItem tempMenuItem = new MenuItem();

            tempMenuItem.Header = plugin.name;

            tempMenuItem.Template = (ControlTemplate)FindResource("twMenuItem");

            tempMenuItem.Click += (sender, args) =>
            {
                plugin.Init();
            };

            Plugin_Menu.Items.Add(tempMenuItem);
        }

          Dispatcher.BeginInvoke(new Action(() => { Main_Menu.Items.Add(Plugin_Menu); }), System.Windows.Threading.DispatcherPriority.ContextIdle);
    }
BlackRock
  • 13
  • 6

0 Answers0