[C# 6] Hogyan futtathatom újra a Process-t, ha a külső programot frissíteni kell?
Ez volna a cél:
Egy kis zenelejátszó programon dolgozom, és a youtube-dl programmal szeretném megoldani azt, hogyha beírok egy YouTube linket a programba, töltse le a videót, konvertálja át MP3-ba majd játssza le - mindezt automatikusan. Időről időre azonban előfordul, hogy a youtube-dl-nek nem sikerül letöltenie a videót és a standard error-ra kiírja, hogy frissíteni kell. Ekkor szeretném automatikusan megismételni a folyamatot.
A youtube-dl-t kezelő osztályom egyszerűsített váza így néz ki:
class YoutubeDl {
.. public event EventHandler UpdateRequired;
..
.. public async Task DownloadAudioAsync(string YoutubeUri, string Filename) {
.. .. #region Error checking
.. .. .. //Megnézem, hogy a YoutubeUri és a Filename helyesen vannak-e megadva, a youtube-dl és az ffmpeg elérhető-e stb.
.. .. #endregion
.. ..
.. .. Process p = new Process(...);
.. .. //p.RedirectStandardOutput és p.RedirectStandardError true, p.UseShellExecute false
.. .. p.ErrorDataReceived += this.YoutubeDlErrorReceived;
.. .. p.OutputDataReceived += ...;
.. ..
.. .. p.Start();
.. .. p.BeginOutputReadLine();
.. .. p.BeginErrorReadLine();
.. ..
.. .. await p.WaitForEndAsync(); //saját extension method
.. }
..
.. public async Task UpdateAsync() {
.. .. //frissítjük a youtube-dl-t
.. }
..
.. private void YoutubeDlErrorReceived(object sender, DataReceivedEventArgs e) {
.. .. if (e.Data szerint frissíteni kell a youtube-dl-t)
.. .. .. this.UpdateRequired?.Invoke(this, EventArgs.Empty);
.. }
}
Ha én ezt meghívom így:
YoutubeDl ytd = new YoutubeDl();
await ytd.DownloadAudioAsync(...);
és kiderül, hogy a youtube-dl-t frissíteni kell, lefusson az UpdateAsync és ismét elinduljon a DownloadAudioAsync? Ez legyen annak a felelőssége, aki használja az osztályt (UpdateRequired event használatával), vagy jobb, ha a frissítést maga a YoutubeDl osztály végzi el? Hogy szokás ezt csinálni?
Ha feltétlenül ragaszkodsz ahhoz, hogy hiba esetén újra próbálkozzon, akkor én az osztályt használó kontrollerben tenném ezt meg.
Amúgy meg ha én írnám, akkor dobnék egy hibaüzenetet. "Nem sikerült az xy művelet, megpróbálja újra?" És ha igen a válasz, akkor megpróbálja megint.
Kiemelted a kérdést, csak nem tudom minek.
Nem teljesen világos az architektúra, de szerintem nem akarsz Te a háttérben semmilyen processzeket futtatgatni, mert halál lesz kitesztelni, debuggolni, használni.
Ha frissíteni kell valamit, akkor dobsz egy kivételt, aztán szevasz, majd aki akarja lekezeli.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!