Некоторое время назад я попросил некоторую помощь по настройке индикатора выполнения, чтобы показать пользователю, как много было сделано для данного набора файлов и папок.
Смотрите здесь:
Первая попытка у фонового работника.
В результате мне удалось заставить его работать, но в некоторых случаях он частично заполняется, а иногда нет вообще. Выход со следующим исключением?
TargetInvocationException был не обработан .. Исключение было сгенерировано целью вызова.
Бомбардировка этой строки кода в моей программе.
[MTAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm()); <-- Exception raised at this line !!!
}
Он также был выделен зеленым цветом, чего я никогда раньше не видел. Я также попытался изменить атрибут также с STA на MTA. Если это что-то или что-то не так ... тогда, пожалуйста, расскажите. Поскольку я склонен полагать, что это должно быть возглавлено [MTAThread].
Мое приложение не вызывает ошибку, если я не сообщаю о прогрессе, но когда я делаю выше, всегда гарантируется, что произойдет. Я очистил свой обработчик событий DoWork, чтобы он не вызывал межпотоковые вызовы для потока, в котором определен какой-либо элемент управления, т. Е. Метка. Я удалил их, даже если они работают, хотя Albabari.com сказал мне, что они не должны работать и не должны быть там. Так что я удалил и застрял с этим ... Это намного проще, чище, аккуратнее и поточнее с показанной важной частью.
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
...
for (int i = 0; i < allFiles.Length; i++)
{
localSize += allFiles[i].Length;
// a label used to say what file is being processed.
//toolStripStatusLabel.Text = allFiles[i].Name;
localFiles++;
worker.ReportProgress((100 * i) / allFiles.Length);
}
...
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// this event handler is also implemented in my application.
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
fileRetrievalProgressBar.Value = Math.Min(e.ProgressPercentage, 100);
}
Выше показано, как выглядят мои обработчики событий. Надеюсь, этого будет достаточно для того, чтобы кто-нибудь помог мне, и многие из тех, кого я спрашивал, все здесь рисуют.
Имеет ли моя проблема что-то, связанное с тем, как я называю мой индикатор выполнения, или с тем, чтобы сделать и 1027 *, или BeginInvoke()
... что-то похожее на эти строки. Я просто догадываюсь, но фоновый работник не сделает это автоматически для вас. Или это автоматически подразумевается и что-то, на что я должен ответить, поскольку я не знаю, когда это может произойти. Так что мне придется делать что-то вроде:
this.Invoke()
или this.BeginInvoke()
При наведении указателя мыши на обе части кода открывается интересная подсказка, которая имеет большой смысл, но я изо всех сил пытаюсь реализовать. Как я считаю, анонимный метод используется? Я использую ниже мой пример для предыдущего заявления:
// Takes callbacks from the GetTotalSize() method
private void ProgressCallback(float p)
{
// Invokes update progress bar on GUI thread:
this.BeginInvoke(updateProgMethod, new object[] { p });
}
// Actually updates the progress bar:
private void UpdateProgress(float p)
{
progressBar.Value = (int)(p * (progressBar.Maximum - progressBar.Minimum)) + progressBar.Minimum;
}
Благодаря парню под названием «У Сесила есть имя»!
Так и должно быть. С нетерпением жду некоторых ответов на эту мою маленькую проблему.