前提・実現したいこと
以下のソースコードにおいて、
メソッドHogehoge内で生成される値barを、Btn_Click内の処理で随時取得したく、
メソッドGetValueAsyncを作成したのですが、
GetValueAsync内のwhileループでCPU使用率がとても高くなってしまいます。
該当のソースコード
csharp
1 2private string _foo; 3 4private async task Hogehoge() 5{ 6 while(条件式) 7 { 8 ... 9 this._foo = bar; // barはこのHogehoge内で生成される値 10 } 11 ... 12} 13 14private async Task<string> GetValueAsync() 15{ 16 var value = await Task.Run(() => 17 { 18 while (true) 19 { 20 if (this._foo != null) 21 return this._foo; 22 } 23 }); 24 25 this._foo = null; 26 27 return value; 28} 29 30public async void Btn_Click(object sender, RoutedEventArgs e) 31{ 32 while(true) 33 { 34 Debug.WriteLine(await GetValueAsync()); 35 } 36}
試したこと
以下のように、Task.Delay(1)を入れるとCPU使用率が上がることがなくなったのですが、
こんな解決策でよいのか(そもそもなぜこれで解決するのか)、またもっと他に良い方法がないかと思っています。
詳しい方おられましたら、ご教授お願いいたします。
csharp
1private async Task<string> GetValueAsync() 2{ 3 var value = await Task.Run(async () => 4 { 5 while (true) 6 { 7 await Task.Delay(1); // これを追加 8 if (this._foo != null) 9 return this._foo; 10 } 11 }); 12 13 this._foo = null; 14 15 return value; 16} 17
補足(実現したいこと)
barの値の取得に関してですが、
Btn_Click内でGetValueAsyncが呼ばれたタイミングのbarの値が取得できればそれでいいです。
Btn_Click内でGetValueAsyncが呼ばれたタイミングのbarの値(ただし、barが更新されていなければ、更新されるまで待つ)を取得したいです。
解決策?
いただいた回答に基づいて、コードを改良してみました。
csharp
1 2private readonly AutoResetEvent condition = new AutoResetEvent(false); 3 4private async Task<string> GetValueAsync() 5{ 6 await Task.Run(() => 7 { 8 condition.WaitOne(); 9 }); 10 return this._originaltext; 11} 12
Hogehogeメソッドのとこには、
this._foo = bar;
の下に、condition.Set();
を記述。
回答2件
あなたの回答
tips
プレビュー