質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

1回答

676閲覧

Task.Wait();の使い方が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2021/04/02 06:32

編集2021/04/02 07:10

提示コードは音楽ファイルを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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/02 07:06

> await async 使った非同期の処理でTask.Wait();の使い方 そういう話ではなくて、タスク並列ライブラリ (TPL) をどう使ったらよいかという話でなないのですか? (UI のブロックは関係ないコンソールアプリの話と理解)
guest

回答1

0

ベストアンサー

タスク並列ライブラリ (TPL) をどう使ったらよいかという話でなないのですか?

タスク並列ライブラリ (TPL)
http://surferonwww.info/BlogEngine/post/2020/12/27/task-parallel-library.aspx

そうではないとすると、await Task.WhenAll で待機するということでしょうか?

であれば、TPL ではありませんが、上の記事の一番下のサンプル(// 非同期版メソッド 5 つを実行、// await Task.WhenAll で待機とコメントしてあるコード)に近いのではと思います。

投稿2021/04/02 07:42

編集2021/04/02 07:45
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問