Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual studio扩展、后台工作人员和UI_C#_Visual Studio - Fatal编程技术网

C# Visual studio扩展、后台工作人员和UI

C# Visual studio扩展、后台工作人员和UI,c#,visual-studio,C#,Visual Studio,今天我在一个VisualStudio扩展项目(VS2013)中重构一些代码,我遇到了一些奇怪的事情 在代码中有一个后台工作程序,它执行一个持久的任务。在dowork事件代码中,调用VisualStudio的UI组件。令我惊讶的是,这段代码毫无例外地执行。当我认为UI更新只能在progresschanged和doworkcomplete事件中完成时,我是否过时了 我在Visual Studio(2013)扩展项目中尝试执行以下代码时感到惊讶: private void StartAJob()

今天我在一个VisualStudio扩展项目(VS2013)中重构一些代码,我遇到了一些奇怪的事情

在代码中有一个后台工作程序,它执行一个持久的任务。在
dowork
事件代码中,调用VisualStudio的UI组件。令我惊讶的是,这段代码毫无例外地执行。当我认为UI更新只能在
progresschanged
doworkcomplete
事件中完成时,我是否过时了

我在Visual Studio(2013)扩展项目中尝试执行以下代码时感到惊讶:

 private void StartAJob()
        {
            BackgroundWorker bgWork = new BackgroundWorker();
            bgWork.DoWork += Work;
            bgWork.RunWorkerAsync();

        }

        private void Work(object sender, DoWorkEventArgs e)
        {
            var statusBar = (IVsStatusbar)GetService(typeof(SVsStatusbar));
            statusBar.Progress(1, 1, "Starting a job...", 0, 2);
            //do something that that takes a while
            statusBar.Progress(1, 1, "A little longer...", 1, 2);
            //do something else
            statusBar.Progress(1, 1, "Done!", 2, 2);
            MessageBox.Show("yay?");
        }

这是否意味着我现在可以在dowork事件中节省执行接口代码(他们总是告诉我不要这样做)。或者这是某种VisualStudio魔法,它在远离我的代码的地方解决了异常

您可以在后台工作程序中使用该接口,但是您应该检查

调用所需

当您从后台工作程序触摸任何UI时,因为它可能在UI线程的单独线程上运行。例如:

delegate void ProgressMessageCallback(string message);

    private void ProgressMessage(string message)
    {
        if (InvokeRequired)
        {
            ProgressMessageCallback d = new ProgressMessageCallback(ProgressMessage);
            this.Invoke(d, new object[] { message });
        }
        else
        {
            this.lblProgressMessage.Text = message;
        }
    }

只是猜测,但可能是编写VS组件是为了检查调用是否需要同步到UI线程(例如,就像您使用
invokererequired
检查一样)是否同意前面的评论。很可能有同步代码。这不是唯一的-例如,WPF绑定可以为您执行同步。@ZdeslavVojkovic我想这应该是沿着这些路线进行的。但是我找不到任何东西来支持这个理论。@Dennis,这是有道理的。VS接口不是用WPF编写的吗?@NickOtten:我不这么认为。VS是一种弗兰肯斯坦,具有本机和托管组件。其中一些可能是使用WPF编写的,但只有一些…
invokererequired
在这里没有帮助。OP调用VS自动化接口,而不是winforms控件。我知道这一点,通常我会使用progresschanged和doworkcomplete事件来更新接口。然而现在它似乎在嫁妆活动中起作用,我很好奇为什么。