2013-11-24 8 views
0

У меня есть следующий код, который читает файл, а также увеличивает индикатор выполнения при чтении, но я не вижу никаких действий в моем progressBar. может кто-нибудь, пожалуйста, помогите мне, почему?Индикатор выполнения не увеличивается

progressBar1.Minimum = 0; 
progressBar1.Maximum = (int)fileStream.Length + 1; 
progressBar1.Value = 0; 

using (fileStream) 
{ 
    fileStreamLength = (int)fileStream.Length + 1; 
    fileInBytes = new byte[fileStreamLength]; 
    int currbyte = 0, i = 0; 
    var a = 0; 
    while (currbyte != -1) 
    { 
     currbyte = fileStream.ReadByte(); 
     fileInBytes[i++] = (byte)currbyte; 
     progressBar1.Value=i; 

    } 

} 
+0

ваш код работает в той же теме, что и поток пользовательского интерфейса, для решения этой проблемы используется многопоточность. – David

+0

Будьте осторожны с тем потоком, в котором вы все это делаете (это поток пользовательского интерфейса?). Кроме того, если вы размещаете небольшой рабочий (нерабочий, который должен работать) пример, ваши шансы на помощь будут больше. –

ответ

2

Он увеличивается, но вы не можете его увидеть. Это вызвано запуском вашего цикла в потоке пользовательского интерфейса. Ищите шаблон BackGroundWorker или async/await.

0

Пользователь Method Invoker для обновления пользовательского интерфейса ... попробовать это ...

ли все ваши работы в потоке и при обновлении progressbar использовать следующие строки ...

Для Windows Forms

this.Invoke((MethodInvoker) delegate 
{ 
progressBar1.value=i; 
}); 

Для WPF

Dispatcher.BeginInvoke(new Action(delegate 
{ 
progressBar1.value=i; 
})); 
+0

'.MainWindow 'не содержит определения для' Invoke 'и никакого метода расширения' Invoke ', принимающего первый аргумент типа' .MainWindow 'может быть найден.' – Maven

+0

Я думаю, это поможет вам, [MSDN] (http: //msdn.microsoft.com/en-us/library/system.windows.forms.methodinvoker%28v=vs.110%29.aspx) – Anjan

+0

его из 'System.Windows.Forms' я использую' WPF' – Maven

0

Ваш лучший вариант будет Background Worker.
перетащить BackgroundWorker с панели инструментов. то вам нужно реализовать 2 функции: один выполняет фоновый режим, другой - для представления пользовательского интерфейса.

using System.ComponentModel; 
using System.Threading; 

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

private void Form1_Load(object sender, System.EventArgs e) 
{ 
    // Start the BackgroundWorker. 
    backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
     // begin reading your file here... 

     // set the progress bar value and report it to the main UI 
     int i = 0; // value between 0~100 
     backgroundWorker1.ReportProgress(i); 
} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    // Change the value of the ProgressBar to the BackgroundWorker progress. 
    progressBar1.Value = e.ProgressPercentage; 
    // Set the text. 
    this.Text = e.ProgressPercentage.ToString(); 
} 
} 
Смежные вопросы