提示コードは音楽ファイルをm4aに変換するコードですがこの処理を非同期で行いたいのですがその場合でTask.Wait();の使い方がわかりません。
コメント内部のコードですが実際どうやればいいのでしょうか?このfor文だと最初の非同期が終了するまで待機するという処理になってまい
非同期でも非同期ではなくってる気がするのですがどうすればいいのでしょうか?
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 13 //ディレクトリ内部を表示 14 static List<string> GetDirectory(string path) 15 { 16 List<string> name = new List<string>(); 17 string[] list = Directory.GetFiles(path, "*", SearchOption.AllDirectories); 18 19 foreach (string na in list) 20 { 21 Console.WriteLine(na); 22 name.Add(na); 23 } 24 25 return name; 26 } 27 28 //コマンドを取得 29 static string GetCommand(string path) 30 { 31 path = "\"" + path + "\""; 32 33 string ext = Path.GetExtension(path); 34 string st = ext.Replace("\"", ""); 35 36 if (st == ".flac") 37 { 38 39 string outPath = path.Replace(ext, ".m4a"); 40 41 42 string command = " -i " + path + " -c:v copy -metadata comment=\"\" -acodec alac" + " " + outPath + "\""; 43 44 Console.WriteLine(); 45 Console.WriteLine(); 46 Console.WriteLine(""+ command); 47 Console.WriteLine(); 48 Console.WriteLine(); 49 50 return command; 51 } 52 else 53 { 54 return null; 55 } 56 57 } 58 59 //ファイルをエンコードする 60 public static async Task<int> ConvertFile(string str) 61 { 62 return await Task.Run(() => 63 { 64 Process pro = new Process(); 65 66 //エンコードをかける 67 string st = GetCommand(str); 68 if (st != null) 69 { 70 71 pro.StartInfo.FileName = "ffmpeg.exe"; 72 pro.StartInfo.Arguments = st; //引数 73 pro.Start(); 74 pro.WaitForExit(); //処理を待機 75 Console.WriteLine("exit code: " + pro.ExitCode); 76 pro.Close(); 77 78 return pro.ExitCode; 79 } 80 else 81 { 82 return 1; 83 } 84 }); 85 86 } 87 88 89 90 91 92 static void Main(string[] args) 93 { 94 95 string str = args[0]; 96 List<string> na = GetDirectory(str); 97 List<Task<int>> taskList = new List<Task<int>>(); 98 foreach (string n in na) 99 { 100 taskList.Add(ConvertFile(n)); 101 } 102///////////////////////////////////////////////////////////////////////// 103 foreach (Task<int> n in taskList) 104 { 105 n.Wait(); 106 } 107///////////////////////////////////////////////////////////////////////// 108 109 110 111 Console.ReadKey(); 112 } 113 } 114} 115
> await async 使った非同期の処理でTask.Wait();の使い方
そういう話ではなくて、タスク並列ライブラリ (TPL) をどう使ったらよいかという話でなないのですか? (UI のブロックは関係ないコンソールアプリの話と理解)
回答1件
あなたの回答
tips
プレビュー