Раньше я устал от использования BackgroundWorker, потому что для правильной работы требовалось так много функций. Однако, когда я перешел на C # из VB.NET (около месяца назад), я наткнулся на очень простой способ их создания;
Пример;
private void cmdMaxCompressPNG_Click(object sender, EventArgs e) {
pbStatus.Maximum = lstFiles.Items.Count;
List<string> FileList = Load_Listbox_Data();
var bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.DoWork += delegate {
foreach (string FileName in FileList) {
ShellandWait("optipng.exe", String.Format("\"{0}\"", FileName));
bw.ReportProgress(1);
}
};
bw.ProgressChanged += (object s, ProgressChangedEventArgs ex) => {
pbStatus.Value += 1;
};
bw.RunWorkerCompleted += delegate {
lstFiles.Items.Clear();
pbStatus.Value = 0;
MessageBox.Show(text: "Task Complete", caption: "Status Update");
};
bw.RunWorkerAsync();
}
Вот оно, все в одной функции! Легко написать, легко понять, и никакой реальной работы ног. Я даже сделал фрагмент из этого. С тех пор я преобразовал все свои многокомпонентные функции BackgroundWorker в этот маленький кусочек элегантного кода. Я также начал использовать их более свободно, чем в прошлом. Вчера я читал статью об Async и Await и о том, как, по-видимому, я должен делать вещи. У меня проблемы с обхватом головы.
Я пытался использовать локальные функции, но не могу получить правильную формулировку. Он пытается установить его синхронность.
Как бы я преобразовал вышеупомянутое в столь же жесткую реализацию логики Await / Async?
[Изменить]
ShellandWait;
private void ShellandWait(string ProcessPath, string Arguments, bool boolWait = true) {
System.Diagnostics.Process ShellProcess = new System.Diagnostics.Process();
ShellProcess.StartInfo.FileName = ProcessPath;
ShellProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
ShellProcess.StartInfo.Arguments = Arguments;
ShellProcess.StartInfo.CreateNoWindow = true;
ShellProcess.StartInfo.UseShellExecute = false;
ShellProcess.StartInfo.RedirectStandardOutput = true;
ShellProcess.Start();
if (boolWait) { ShellProcess.WaitForExit(); }
if (boolWait) { ShellProcess.Close(); }
}