提示子ですがマルチタスクで音楽ファイルをエンコードしてするのですが終わった順番から[ 2 / 300] : タイトル
のように画面に表示させたいのですがどうすればいいのでしょうか?
Task.Runに数字を入れましたが非同期ですので数字がバラバラで順番になりません。これはどうしたらいいのでしょうか?
cs
1using System; 2using System.Threading.Tasks; 3using System.Diagnostics; 4using System.IO; 5using System.Collections.Generic; 6 7namespace Test 8{ 9 class Program 10 { 11 //ダブルクォートをつける 12 static string AddDoubleQuote(string path) 13 { 14 return "\"" + path + "\""; 15 } 16 17 //ダブルクォートを外す 18 static string DeleteDoubleQuote(string path) 19 { 20 path = path.Replace("\"", ""); 21 path = path.Replace("\"", ""); 22 23 return path; 24 } 25 26 27 //ディレクトリ内部を表示 28 static List<string> GetDirectory(string path) 29 { 30 List<string> name = new List<string>(); 31 string[] list = Directory.GetFiles(path, "*", SearchOption.AllDirectories); 32 33 foreach (string na in list) 34 { 35 name.Add(na); 36 } 37 38 return name; 39 } 40 41 //コマンドを取得 42 static string GetCommand(string in_path,string out_path) 43 { 44 in_path = "\"" + in_path + "\""; 45 46 string ext = Path.GetExtension(in_path); 47 ext = ext.Replace("\"", ""); 48 //Console.WriteLine(ext); 49 if (ext == ".flac") 50 { 51// Console.WriteLine("ああああ " + ext ); 52 out_path = "\""+ out_path.Replace(ext, ".m4a"); 53 54 55 string command = " -i " + in_path + " -c:v copy -metadata comment=\"\" -acodec alac" + " " + out_path + "\""; 56 return command; 57 } 58 else 59 { 60 return null; 61 } 62 63 } 64 //////////////////////////////////////////////////////////////////////////////////////////////////// 65 //ファイルをエンコードする 66 public static async Task<int> ConvertFile(string in_path,string out_path) 67 { 68 return await Task.Run(() => 69 { 70 Process pro = new Process(); 71 72 //エンコードをかける 73 string st = GetCommand(in_path,out_path); 74 if (st != null) 75 { 76 77 pro.StartInfo.FileName = "ffmpeg.exe"; 78 pro.StartInfo.Arguments = st; //引数 79 pro.StartInfo.CreateNoWindow = true; //コンソール画面を表示しない。 80 pro.Start(); 81 pro.WaitForExit(); //処理を待機 82 //Console.WriteLine("exit code: " + pro.ExitCode); 83 Console.WriteLine(Path.GetFileName(st)); 84 85 int e = pro.ExitCode; 86 pro.Close(); 87 88 return e; 89 //return pro.ExitCode; 90 } 91 else 92 { 93 // Console.WriteLine("Error"); 94 return -1; 95 } 96 }); 97 98 } 99////////////////////////////////////////////////////////////////////////////////////////////////////////////// 100 101 102 103 104 static void Main(string[] args) 105 { 106 107 //string str = args[0]; 108 string str = Console.ReadLine(); //ファイル名をD&D 109 str = DeleteDoubleQuote(str); //ダブルクォートを外す 110 111 List<string> filePath = GetDirectory(str); //ディレクトリを取得 112 List<string> destPath = new List<string>(); //保存先のパス 113 List<Task<int>> tasklist = new List<Task<int>>(); //タスクリスト 114 115 int num = 0; 116 foreach (string n in filePath) 117 { 118 Directory.CreateDirectory(Path.GetDirectoryName(n.Replace(Directory.GetParent(str).FullName, Directory.GetCurrentDirectory()))); //フォルダ作成 119 tasklist.Add(ConvertFile(n, n.Replace(Directory.GetParent(str).FullName, Directory.GetCurrentDirectory()))); 120 } 121 122 Task.WaitAll(tasklist.ToArray()); //待機 123 124 125 Console.WriteLine("変換終了"); 126 127 Console.ReadKey(); 128 } 129 } 130} 131
そもそも何故非同期で実行したいのでしょう?
CPUをフルに使いたいだけなら、ffmpeg自体をマルチスレッドで起動すれば良さそうですが。
質問ですがその場合Task処理は外さないといけないのでしょうか?
別に使ってもいいですけど、特にメリットはないと思います。(むしろ非同期で処理がややこしくなるのがデメリット)
回答2件
あなたの回答
tips
プレビュー