C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: WPF非同期処理。起動後、常に裏で処理をし続けたい。


(過去ログ 140 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■82277 / inTopicNo.1)  WPF非同期処理。起動後、常に裏で処理をし続けたい。
  
□投稿者/ くならー (1回)-(2016/12/27(Tue) 07:08:51)

分類:[.NET 全般] 

いつもお世話になっております。

掲題の通りです。環境はVS2015Com,C#

実現の為に以下のような記述を行いテストしました。
実行してみると、画面は待機状態(カーソルが待機のものに変化し、画面操作が出来なくなる)となりました。

/// <summary>
/// 画面描写後イベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void winTest_ContentRendered(object sender, EventArgs e)
{
    await AsyncLoop();
}


async Task AsyncLoop()
{
    while (true)
    {
        string result = "TEST";
	
	//画面に存在するコントロールtextBoxに文字列を追加し続ける
        Application.Current.Dispatcher.Invoke(new Action(() => { textBox.Text += result; }));
    }
}

ボタン等をトリガーに処理するサンプルは見つかっているのですが、
起動と同時に処理が走るサンプルが見つからず、試行錯誤している現状です。

至らぬ点あれば、ご指導のほどお願いしたく思います。

引用返信 編集キー/
■82278 / inTopicNo.2)  Re[1]: WPF非同期処理
□投稿者/ Azulean (752回)-(2016/12/27(Tue) 07:59:27)
2016/12/27(Tue) 08:00:05 編集(投稿者)

while ループで全力で処理すると、そうなります。
少なくとも、スレッド側(今回の例で言う Task で処理されるメソッド側)で Sleep を入れて他の処理を入れる余力を作り出すか、タイマー系で処理するかなどを考える必要があります。

(人が思うほどゆっくり処理しているわけではなく、超高速で処理されるため、マウス操作などのウィンドウメッセージが入り込む余地がなくなっているのが現状です)
引用返信 編集キー/
■82279 / inTopicNo.3)  Re[1]: WPF非同期処理。起動後、常に裏で処理をし続けたい。
□投稿者/ とっちゃん (414回)-(2016/12/27(Tue) 11:22:53)
No82277 (くならー さん) に返信

AsyncLoop() が非同期処理になっていません。
コンパイルは通りますが

warning CS1998: この非同期メソッドには 'await' 演算子がないため、同期的に実行されます。'await' 演算子を使用して非ブロッキング API 呼び出しを待機するか、'await Task.Run(...)' を使用してバックグラウンドのスレッドに対して CPU 主体の処理を実行することを検討してください。

というワーニングが出ていると思います。

デバッグ実行し、while ループの中のどこかにブレークポイントを置いてみてください。
スタックトレースで winTest_ContentRendered から直接呼ばれていることがわかると思います。

引用返信 編集キー/
■82283 / inTopicNo.4)  Re[2]: WPF非同期処理。起動後、常に裏で処理をし続けたい。
□投稿者/ くならー (2回)-(2016/12/28(Wed) 07:38:24)

Azulean様、とっちゃん様ありがとうございました。

実はまだ検証していないのですが、クローズ致します。
頂いた意見を基に改善したいと思います。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -