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

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

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

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

Q&A

解決済

3回答

17554閲覧

同時に複数のスレッドを実行させる。

takagi.1994

総合スコア47

C#

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

0グッド

0クリップ

投稿2015/12/25 10:35

編集2015/12/25 10:39

private void main()
{
bool flag1 = await test1();
bool flag2 = await test2();
if (flag1 && flag2)
{
// next step
}
else if (flag2)
{
// test2()を再度実行(flag2がtrueになるまで実行する)
}
else if (flag2)
{
// test1()を再度実行(flag1がtrueになるまで実行する)
}
}

private async Task<bool> test1()
{
return await System.Threading.Tasks.Task.Run(() =>
{
try
{
Thread.Sleep(5000);
return true;
}
catch
{
return false;
}
});
}

private async Task<bool> test2()
{
return await System.Threading.Tasks.Task.Run(() =>
{
try
{
Thread.Sleep(3000);
return true;
}
catch
{
return false;
}
});
}

書き方がまちがえているというよりは、やりたいことだと思っていただけるとたすかります。
上記のようにそれぞれ時間のかかる処理を同時にバックグラウンドで実行させ、全ての処理が終わったらその結果を元に次のステップに移りたい場合、どういうやり方が正しいのかわかりません。
どうぞご教授お願いします。
ちなみに、それぞれの処理というのは各種データなどをファイルなどからそれぞれ取得してくるなどのことです。
また、この場合、各種データはデータ間での干渉はないのですが、それらのデータがすべてないと次のステップに進むことができない。とお考えいただければと思います。

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

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

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

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

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

guest

回答3

0

最近 Thread は流行らないみたいですが、こんなんいかがでしょうか。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading; 6 7namespace t23437 8{ 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 new Program().main(); 14 } 15 16 private void main() 17 { 18 Thread th1 = new Thread((ThreadStart)delegate 19 { 20 while (test1() == false) ; 21 }); 22 th1.Start(); 23 while (test2() == false) ; 24 th1.Join(); 25 } 26 27 private bool test1() 28 { 29 try 30 { 31 Thread.Sleep(5000); 32 return true; 33 } 34 catch 35 { 36 return false; 37 } 38 } 39 40 private bool test2() 41 { 42 try 43 { 44 Thread.Sleep(3000); 45 return true; 46 } 47 catch 48 { 49 return false; 50 } 51 } 52 } 53}

投稿2016/01/03 08:37

IchigoTaruto

総合スコア159

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

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

takagi.1994

2016/01/06 21:47

ありがとうございます。 しっかり読んで勉強させていただきます。
guest

0

ベストアンサー

「やりたいこと」と思われることをそのまま実装すると、こんな感じになると思います。

C#

1private void main() 2{ 3 var task1 = Task.Run<bool>(new Func<bool>(test1)); 4 var task2 = Task.Run<bool>(new Func<bool>(test2)); 5 Task.WaitAll(task1, task2); 6 while(!task1.Result || !task2.Result) 7 { 8 if(!task1.Result) 9 { 10 task1 = Task.Run<bool>(new Func<bool>(test1)); 11 } 12 if(!task2.Result) 13 { 14 task2 = Task.Run<bool>(new Func<bool>(test2)); 15 } 16 Task.WaitAll(task1, task2); 17 } 18 19 // next step 20} 21 22private bool test1() 23{ 24 try 25 { 26 Thread.Sleep(5000); 27 return true; 28 } 29 catch 30 { 31 return false; 32 } 33} 34 35private bool test2() 36{ 37 try 38 { 39 Thread.Sleep(3000); 40 return true; 41 } 42 catch 43 { 44 return false; 45 } 46} 47```タスクは成功するまで繰り返し実行する必要があるということなので、mainメソッドをこのような書き方にしましたが、できればtest1/test2メソッド内で繰り返させた方が呼び出し側のコードを簡潔にできると思います。

投稿2015/12/25 12:34

catsforepaw

総合スコア5938

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

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

0

こんにちは。

バックグラウンドスレッドで同期を取りつつ並列処理をしたい、
ということだと解釈しました。(間違ってたすみません。)

button1_clickをmain()と読み替えてもらえたら。
async/awaitで非同期処理を1本つくって、その中でTPLで並列処理します。

それぞれの処理が終わった後の「次の処理」をメインスレッドで実行したい場合はbutton1_Click内のawaitの後に実行したら良いです。

C#

1private async void button1_Click(object sender, EventArgs e) 2{ 3 await Task.Run(() => 4 { 5 Console.WriteLine("button1.start"); 6 Parallel.Invoke(hoge1, hoge2); 7 Console.WriteLine("button1.end"); 8 }); 9} 10 11private void hoge1() 12{ 13 Console.WriteLine("hoge1.start"); 14 Thread.Sleep(5000); 15 Console.WriteLine("hoge1.end"); 16} 17 18private void hoge2() 19{ 20 Console.WriteLine("hoge2.start"); 21 Thread.Sleep(3000); 22 Console.WriteLine("hoge2.end"); 23}

これ以外の方法でも、同期コンテキストを使って待たせればいくらでも実現する方法はありそうです。

投稿2015/12/25 10:55

編集2015/12/25 11:00
Tak1wa

総合スコア4791

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

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

takagi.1994

2015/12/25 11:13

早速のご回答ありがとうございます。 スキル不足で内容がぴんときていないのですが、この場合、戻り値によってその語の処理を変えたりしたい場合はどうなるのでしょうか? また、同期コンテキストなるものの理解がググってもいまいち理解できないんです。 すいません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問