Lieber Besucher, herzlich willkommen bei: Visual-Basic-Forum VB-Paradise.de. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.
Einen BackgroundWorker (oder einen manuellen Thread) verwendet man immer dann, wenn ein Prozess unter umständen sehr lange dauern kann und während dieser Zeit die Gui der Anwendung nicht einfrieren soll. Siehe dazu auch diesen schönen FAQ-Eintrag von Maximilian: http://dotnetbase.de/faq-warum-frieren-a…n-einb-t49.html
Zitat
, da einige sagen ich sollts mit BGW machen, andere wiederrum sagen bloß nicht mit BGW.
Zitat
Wie man oben an der zeit zieht, haben mittlerweile knapp 4 uhr morgens, und ratet mal wie lange ich es schon versuche.
Irgendwie will ich das jetzt mal verstehen.
Also wäre nett wenn mir jemand helfen könnte.
Darüberhinaus hilft es oft, sich für ein paar Stunden hinzulegen, oder alternativ etwas anderes zu machen (wie wäre es mit Frühsport) - da kommen meistens die besten Ideen 


Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Dennis Alexander« (23. Januar 2010, 22:22)
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »kay2k4« (23. Januar 2010, 19:20)
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
private void processFileWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Zunächst lesen wir das Argument aus und casten es zurück zum Klassentyp
processWorkerInfo pIWork = (processWorkerInfo)e.Argument;
// Wir erstellen eine TimeDate-Variable, inder wir den Startzeitpunkt festlegen
// Anhand dieser Variable können wir später die Bytes pro Sekunde errechnen
DateTime startTime;
cryptStatus cStatus = new cryptStatus();
// Wir erstellen eine Try-Anweisung um evtl. Fehler abzufangen
try
{
// Wir erstellen benötige Objekt zum Verschlüsseln der Datei anhand des AES-Algorithmus
byte[] key = Encoding.ASCII.GetBytes(pIWork.passwordString);
byte[] iv = Encoding.ASCII.GetBytes(pIWork.ivString);
FileStream readStream = new FileStream(pIWork.sourceFile, FileMode.Open);
FileStream writeStream = new FileStream(pIWork.targetFile, FileMode.Create);
RijndaelManaged riMan = new RijndaelManaged();
CryptoStream cryptStream = new CryptoStream(writeStream, riMan.CreateEncryptor(key, iv), CryptoStreamMode.Write);
// Die benötigten Variablen für die Schleife und die Verarbeitung
byte[] processingData = new byte[pIWork.bufferSize];
long bufferCounter = 0;
long buffer = 0;
long fileLength = readStream.Length;
bool done = false;
// Wir weisen den jetzigen Startzeitpunkt zu
startTime = DateTime.Now;
do
{
if(bufferCounter >= fileLength - buffer) {
processingData = new byte[fileLength - pIWork.bufferSize];
buffer = readStream.Read(processingData, 0, Convert.ToInt32(fileLength - bufferCounter));
writeStream.Write(processingData, 0, Convert.ToInt32(buffer));
done = true;
}
buffer = readStream.Read(processingData, 0, Convert.ToInt32(pIWork.bufferSize));
writeStream.Write(processingData, 0, Convert.ToInt32(pIWork.bufferSize));
bufferCounter += buffer;
// Hier werden wir nun unsere Variablen übergeben
// Wir nutzen dazu eine weitere eigene Klasse, um dies möglichst einfach
// handzuhaben - zunächst müssen wir aber noch einige Werte errechnen
// Gesamtgröße in Bytes der zu verschlüsselnden Datei
cStatus.fileSize = fileLength;
// Größe in Bytes der bereits verschlüsselten Datei
cStatus.processedSize = bufferCounter;
// Da dies sehr rechtenintensiv ist, und den Thread komplett auslastet, wird die GUI auch
// hier nicht mehr reagieren. Wir können die CPU massiv entlasten, indem wir nach allen 4096 Bytes
// für 1ms eine Pause einlegen. Dies verlangsamt die Verschlüsselung aber extrem!
System.Threading.Thread.Sleep(1);
// Wir übergeben unser Object
processFileWorker.ReportProgress(cStatus.percentDone, cStatus);
} while (done == false);
}
catch (Exception)
{
// Es ist ein Fehler aufgetreten
throw;
}
}
private void processFileWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Wir casten den UserState zu dem Typ unserer Status-Klasse
cryptStatus cStatus = (cryptStatus)e.UserState;
// Und updaten die GUI
lblSizeComplete.Text = (cStatus.fileSize / 1024 / 1024) + " MB";
lblSizeCrypted.Text = (cStatus.processedSize / 1024 / 1024) + " MB";
lblBytesPerSecound.Text = (cStatus.bytesPerSecound / 1024 / 1024).ToString() + " MB";
lblEstimatedTime.Text = cStatus.timeLeft.TotalSeconds + " Sek";
lblPercent.Text = cStatus.percentDone + " %";
progressBar1.Value = cStatus.percentDone;
}
private void processFileWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Vorgang beendet!");
}
private void btnCryptFile_Click(object sender, EventArgs e)
{
// Erzeuge neues Objekt von unserer Datenklasse
processWorkerInfo pInfo = new processWorkerInfo();
// Wir übernehmen die Daten der GUI
// (Ich nehme hier für dieses Beispiel an, das die Daten i.O sind)
pInfo.sourceFile = txtSource.Text;
pInfo.targetFile = txtTarget.Text;
pInfo.bufferSize = Convert.ToInt64(txtBufferSize.Text);
pInfo.passwordString = txtPassword.Text;
pInfo.ivString = txtSalt.Text;
pInfo.operation = true; // Für das Verschlüsseln nutze ich true, andernfalls false
// Wir starten den BackgroundWorker und geben als Argument die Klasse mit,
// sodass wir nicht auf den anderen Thread zugreifen müssen
processFileWorker.RunWorkerAsync(pInfo);
}
}
|
)




Forensoftware: Burning Board®, entwickelt von WoltLab® GmbH