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

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

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

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

Q&A

解決済

2回答

5131閲覧

Taskが実行されません。

otftrough

総合スコア476

C#

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

0グッド

0クリップ

投稿2016/05/30 02:01

ネットで、ThreadよりTaskを使ったほうが良いという記事を見て、コピペで使ってみましたが、動きません。
MSDNを見ても、同じようなコードがあったのでこれでいいのかなーと思いましたが、なぜ実行されないんでしょうか?
下のコードは、Mainメソッドで複数の画像ファイルを読み込んだ場合に全ての画像を別のウィンドウで表示させるものです。
実行すると、多分Mainメソッドだけで処理が終わるので、何も表示されずにエラーメッセージも出ません。

C#

1 2class TopImage : Form{ 3 4 static void Main(string[] args){ 5 6 for(int i = 0; i < args.Length; i ++){ 7 8 Task.Run(() => { 9 Application.Run(new TopImage(args[i])); 10 }); 11 } 12 } 13 14 public TopImage(string file){ 15 16 //画像の表示やウィンドウの設定 17 } 18}

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

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

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

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

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

guest

回答2

0

ベストアンサー

Taskが別スレッドで動作するのはご存知と思います。

別スレッドで動作するということは、Mainスレッドをブロックしないということです。
Mainメソッドが終了すると、Mainスレッドが終了し、アプリケーションが終了してしまいます。

Task.Waitメソッドなどでタスクの終了を待機してください。

C#

1var runningTask = new List<Task>(); 2 3for (int i = 0; i < 2; i++) 4{ 5 runningTask.Add(Task.Run(() => 6 { 7 Application.Run(new Form1("Hello World!! ")); 8 })); 9} 10 11foreach(Task t in runningTask) 12{ 13 t.Wait(); 14}

追記

C#

1using System; 2using System.Collections.Generic; 3using System.Threading.Tasks; 4using System.Windows.Forms; 5 6namespace Test 7{ 8 class Form1 : Form 9 { 10 static void Main(string[] args) 11 { 12 13 var runningTask = new List<Task>(); 14 15 foreach(string arg in args) 16 { 17 runningTask.Add(Task.Run(() => 18 { 19 Application.Run(new Form1(arg)); 20 })); 21 } 22 23 foreach(var t in runningTask) 24 { 25 t.Wait(); 26 } 27 } 28 29 private TextBox textBox1; 30 31 public Form1(string file) 32 { 33 this.textBox1 = new System.Windows.Forms.TextBox(); 34 this.textBox1.Location = new System.Drawing.Point(10, 10); 35 this.textBox1.Size = new System.Drawing.Size(150, 20); 36 this.textBox1.Text = file; 37 38 this.ClientSize = new System.Drawing.Size(200, 50); 39 this.Controls.Add(this.textBox1); 40 } 41 } 42} 43

投稿2016/05/30 03:44

編集2016/05/31 02:16
wakuwaku

総合スコア386

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

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

otftrough

2016/05/30 08:49

ありがとうございます。 試してみましたが、うまくいきませんでした。 確認のために、Console.WriteLine()をApplication.Runの直前に入れましたが、それも実行されていませんでした。
wakuwaku

2016/05/31 02:11

余談かもしれませんが、args[i]はIndexOutOfRangeExceptionをスローします。 これはargs[i]が評価されるよりも前にforのi++が評価されるからです。 私の環境で実行できるソースを追加しておきます。 ご参考になれば。
guest

0

TopImageではなくhello Worldとかで試してみては?
ついでに引数ちゃんと入れてます?

投稿2016/05/30 02:46

ToyoKskKN

総合スコア28

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

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

otftrough

2016/05/30 03:38

ありがとうございます。 HelloWorld.csを作って、Console.WriteLine("A");をTaskで実行すると、 Mainメソッドに直接入れたときは実行出来ましたが、for文で繰り返すと一度も実行されませんでした。 また、for文の中にt.Wait();を書くとちゃんと指定した回数実行出来ましたが、実行に使ったバッチファイルにはpauseを書いてあるのにすぐcmd画面が消えてしまいうので、まだ何か違うと思います。 同じようにTopImageクラスでもfor文にt.Wait();をいれると、Taskを使わずfor文でループしたときと同じように、ひとつづつしかウィンドウが出てきません。 出てきたウィンドウを閉じると次の画像が新しいウィンドウで表示されるということです。 なので、Task[] t = new Task[args.Length];にして、for文が終わってからt[]を全てWait()しましたが、うまくいきません。 僕が試したのはここまでです。
ToyoKskKN

2016/05/30 08:24

試しに下記コードでデバッグしてみたところ 引数分だけフォームを表示していたのですが違う結果になったという事ですか? それとももっと違うものを期待している? public partial class Form1 : Form { static void Main(string[] args) { Task[] t = new Task[args.Length]; for (int i = 0; i < args.Length; i++) { t[i] = (Task.Run(() => { Application.Run(new Form1()); })); } foreach (Task t1 in t) { t1.Wait(); } } public Form1() { InitializeComponent(); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問