具有VSTO加载项的c#Winform控件使Excel保持响应

时间:2018-08-06 18:38:20

标签: c# excel winforms vsto excel-addins

我是VSTO Excel Addin和Winforms的新手。我创建了一个插件,该插件将启动一个winform页面,其中包含几个复选框,一个按钮和一个标签以指示状态。

enter image description here

winform启动后,我的Excel就没有响应。我想即使打开winform(并单击“完成”按钮)也可以使excel响应。 Button将运行一个长期运行的过程。我该如何实现?有指针吗?

这就是我所拥有的 色带类:

public partial class Ribbon1
    {
        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {

        }

        private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            Form1 fs = new Form1();
            fs.ShowDialog();
        }

    }

表单类:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "Processing please wait";
            await Task.Run(() => { longRunningProcess(); });
            label1.Text = "File 1 Processed";
        }
         public void longRunningProcess()
        {
            Thread.Sleep(5000);
        }
    }

更新: 使用.show可以工作,但是我无法访问label1.Text并得到如下错误:

System.InvalidOperationException: 'Cross-thread operation not valid: Control 'label1' accessed from a thread other than the thread it was created on.'

enter image description here

2 个答案:

答案 0 :(得分:1)

使用Show打开表单,然后使用Invoke编组回UI线程。

答案 1 :(得分:1)

@Sievajet帮助解决了这一问题。如果有人需要,请发布代码。

private async void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "Processing please wait";
            await Task.Run(() => { longRunningProcess(); });
            label1.Invoke((MethodInvoker)delegate {
                label1.Text = "File 1 Processed";
            });
        }