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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

5879閲覧

Visual C#の非同期処理について

tuyudaku

総合スコア75

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2018/06/29 08:51

編集2018/06/29 09:09

C#の非同期処理について
考え方のヒントを頂きたく質問させていただきます。

Formスレッドとは別のスレッドで無限ループを使った完全に独立した処理を

C#

1 var task = Task.Run(() => 2 { 3 Test(); 4 });

このように丸投げする形で行っているのですが
async/awaitを使った非同期処理でこの動作を実現させることは可能でしょうか
つまりはawaitせずに非同期処理を実行させたいのですが
待たずにスレッドを実行させるにはどのようにすればよろしいでしょうか

------------------------追記

C#

1 public Form1() 2 { 3 InitializeComponent(); 4 } 5 6 private async Task test() 7 { 8 var t = getcount(); 9 10 Console.WriteLine("test"); 11 } 12 13 private async void Form1_Load(object sender, EventArgs e) 14 { 15 await test(); 16 17 Console.WriteLine("test"); 18 } 19 20 private Task getcount() 21 { 22 while(true) 23 { 24 Console.WriteLine("テストです"); 25 26 System.Threading.Thread.Sleep(1000); 27 } 28 } 29 }

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

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

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

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

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

YamakawaJunichi

2018/06/29 08:57

投げっぱなしでよいなら提示のコードでできています。さらに言えばvar taskで戻り値を受け取る必要もありません。
tuyudaku

2018/06/29 09:10

動作は出来ているのですが、なんというか...この書き方は「あり」なのかなぁと思いまして...そもそも投げっぱなしの処理を書くこと自体ナンセンスなのかもしれませんが...
tuyudaku

2018/06/29 09:11

追記にコードを書かせていただきましたvar taskのやり方もネットで見つけて試しにやってみたのですが、ソースのtaskメソッドの"test"という文字が出力されるつもりだったのですがされませんでした...どう間違っているのでしょうか
YamakawaJunichi

2018/06/29 09:15

この場合、出力は一秒ごとに「テストです」が出るだけで「test」が出ず、フォームは無応答になってますよね?
tuyudaku

2018/06/29 09:25

そうです!awaitを使わなければ待たないで実行できると記事で見たのでやってみたのですが、awaitを使わなくても待ってる?という感じの動作になったので何か考え方が違うのかと困っているところです
guest

回答1

0

ベストアンサー

まず、asyncキーワードはメソッド内でawaitが使えるようになるだけですから、asyncを付けただけでは非同期にはなりません。
そして、awaitはタスクの実行結果を待つものですから、無限ループをawaitすると無限待機になってしまいます。

追記のコードでは await test(); でtestメソッドの完了を待ちますが、その中で無限ループになっているので無限待機になります。

投げっぱなしならばawaitせずにTask.Runしましょう。

ただし、投げっぱなしはあまり推奨されませんが・・・

下の例の場合、Form1_Loadメソッドではtest()を非同期で投げっぱなしにしてからtest from Form1_Loadを出力してForm1_Loadメソッドを抜けます。

投げっぱなしのtestメソッドではgetcountメソッド内で無限ループになっているのでConsole.WriteLine("test from test")にはたどり着けません。

C#

1 public Form1() 2 { 3 InitializeComponent(); 4 } 5 6 private Task test() 7 { 8 getcount(); 9 10 Console.WriteLine("test from test"); 11 } 12 13 private void Form1_Load(object sender, EventArgs e) 14 { 15 Task.Run(() => test()); 16 17 Console.WriteLine("test from Form1_Load"); 18 } 19 20 private void getcount() 21 { 22 while(true) 23 { 24 Console.WriteLine("テストです"); 25 26 System.Threading.Thread.Sleep(1000); 27 } 28 } 29 }

投稿2018/06/29 09:35

YamakawaJunichi

総合スコア630

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

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

tuyudaku

2018/07/02 07:35

返事が遅れてしまい申し訳ありません やはり、投げっぱなしにするなら素直にTask.Runが一番ですかね >ただし、投げっぱなしはあまり推奨されませんが・・・ ですよね... 実は非同期のソケット通信を作っていて それについての考え方(アルゴリズム?)について悩んでいるところでして 質問文がまとまりそうならそれについてもう少し踏み込んだ質問をしたいと思いますので もし見かけた際はよろしければ回等をお願いいたします。 回等ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問