Я пытаюсь обновить 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();
}
Играю с ним уже пару дней и не могу понять, в чем проблема.
Спасибо, Брайан