|
分類:[.NET 全般]
スレッドのテストプログラムを作ってみました。
目的はAsyncTest1()とAsyncTest2()を非同期に同時処理を 行うことです。 理由は @AsyncTest1で3秒、AsyncTest2で4秒かかるとすると 通常だと7秒かかるので、タスク処理させると AsyncTest2 の 4秒に近い処理で 2つの処理を 行うことができるという考えです。
そこで、以下のように作ってみました。 思うようにとりあえずは動作しました。
public partial class Form1 : Form { bool flag1 = false; bool flag2 = false;
public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { flag1 = flag2 = true;
AsyncTest1(); AsyncTest2();
while(flag1 || flag2) Application.DoEvents(); ⇒A
Console.Write("\r\n終了"); }
public async void AsyncTest1() { Random random = new System.Random(); Console.Write("処理1開始\r\n"); int result = random.Next(1000, 5000); await Task.Run(() => { Thread.Sleep(result); }); Console.Write("処理1終了:時間 {0}\r\n", result); flag1 = false; }
public async void AsyncTest2() { Random random = new System.Random(); Console.Write("処理2開始\r\n"); int result = random.Next(1000, 5000); await Task.Run(() => { Thread.Sleep(result); }); Console.Write("処理2終了:時間 {0}\r\n", result); flag2 = false; } }
ここで、いくつか質問があります。
@目的のためのプログラムの作り方は間違っていないのでしょうか?
AApplication.DoEvents() の代わりに 何もできないようにしようと、Continue に変更すると flag1, flag2 は変更されず無限ループになります。 AsyncTest1(), AsyncTest2() の終了待ちを行うのは どうすればよいのでしょうか?
B実行先のPCが.net 4なので、Task.Run が 使え内容です。 .net 4ようにする場合
Random random = new System.Random(); const int N = 2; Parallel.For(0, N, id => { if(id == 0) { Console.Write("処理1開始\r\n"); int result = random.Next(1000, 5000); Thread.Sleep(result); Console.Write("処理1終了:時間 {0}\r\n", result); } else { Console.Write("処理2開始\r\n"); int result = random.Next(1000, 5000); Thread.Sleep(result); Console.Write("処理2終了:時間 {0}\r\n", result); } });
とすればよいのでしょうか?
|