在尝试从功能区按钮单击事件调用的表单中进行一些冗长的文档处理时,我尝试更新ProgressBar。但是我收到异常消息“跨线程操作无效:控制'progressBar1'是从不是在其上创建线程的线程访问的。”
从独立应用程序中调用时,窗体将按预期工作。 以下是示例表格的标记
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async void Test_Click(object sender, EventArgs e)
{
progressBar.Minimum = 0;
progressBar.Maximum = 100;
progressBar.Step = 1;
var progressHandler = new Progress<int>(value =>
{
//throw the error: "Cross-thread operation not valid: Control 'progressBar' accessed from a thread other than the thread it was created on."
progressBar.Value = value;
});
var progress = progressHandler as IProgress<int>;
await Task.Run(() =>
{
for (int i = 0; i != 100; ++i)
{
if (progress != null)
progress.Report(i);
Thread.Sleep(100);
}
});
progressBar.Value = progressBar.Maximum;
}
}
从独立应用程序调用时效果很好。
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
但是我遇到了一个异常“跨线程操作无效:控制'progressBar1'是从创建它的线程之外的其他线程访问的。”当我从功能区按钮单击事件中调用它时。请参见下面的代码。
private void btnRibbon_Click(object sender, RibbonControlEventArgs e)
{
var bf = new Form1();
bf.Show();
}
已经玩了两天了,无法弄清楚问题出在哪里。
谢谢, 布莱恩