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

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

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

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

Q&A

3回答

6590閲覧

複数の関数を並列的に処理をする

Gluek731

総合スコア26

C#

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

2グッド

1クリップ

投稿2016/02/12 07:22

電子黒板のプログラムを作成している者です。

C#を扱っていて思ったのですが、関数同士を並列で処理することって出来るのでしょうか?

関数(a)と関数(b)があり、関数aが計算している最中にユーザーからの入力で反応する関数bを動かす

という事は出来るのでしょうか?

プログラムを作成しているときに並列処理を用いる必要があるのか、またはプログラムを根本から変えれば行けるのか悩んでしまい、質問させていただきました。

分かる方が居ましたらお願いします。

mpyw, ai_2013_dev👍を押しています

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

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

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

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

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

coco_bauer

2016/02/12 07:40

関数aと関数bが独立(両方で共有している変数やファイルなどが存在しない)なら、比較的簡単です。相互に関係しているのなら、慎重に設計しないとデッドロックなどで動かなくなります。 もっと具体的に説明をしないと、適切な回答を得られないと思います。
guest

回答3

0

Taskとasync/awaitでこなすのがモダンな方法です. Threadは旧いやり方です.

変数を共有するメソッドが他にある場合,適切に排他制御を行ってください.

投稿2016/02/12 08:27

mpyw

総合スコア5223

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

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

0

アプリケーションが対象としている動作環境によって(コンソールなのか GUI なのか)、どのような手段を使って並列処理するべきなのかが異なります。

たとえば .NET 4.5 以上を対象にしたコンソールアプリケーションであれば、Console の操作にスレッドを意識する必要がないので次のように書くことができます。

lang

1using System; 2using System.Threading.Tasks; 3 4class Program 5{ 6 static void Main(string[] args) 7 { 8 // DoSomething が呼び出されるがこの関数は結果を待機せずにそのまま実行される 9 var task = DoSomething(); 10 // ユーザー入力を待機する 11 int input = int.Parse(Console.ReadLine()); 12 // DoSomething の結果を待機する 13 task.Wait(); 14 // 結果は Task.Result に格納されているので入力と足し算して表示 15 Console.WriteLine("実行結果: {0}", task.Result + input); 16 } 17 18 static async Task<int> DoSomething() 19 { 20 // 例)時間のかかる計算をする 21 await Task.Delay(4000); 22 return 5; 23 } 24}

もし作成しているアプリケーションが Windows Forms や WPF の場合は、スレッドコンテキストを意識した作りに変える必要があります。

投稿2016/02/12 09:31

編集2016/02/12 09:33
chitoku

総合スコア1610

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

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

0

こんにちは。

(少し意味不明な記述をしてましたので、修正しました。)

関数(a)で時間がかかる処理を行うので、その実行中にユーザ入力に応答して関数(b)を実行したいのですね。
そのような時はサブ・スレッドを生成して関数(a)を実行させることで対応することが一般的です。
でも、マルチスレッド・プログラミングは本当に難しいです。
ここは基本から説明してあり良さそうですよ。
理解するのはたいへんですが、プログラマとして身につけると非常に有用な技術です。頑張って下さい。


【補足】
async/awaitはサブ・スレッドを容易に使えるようにする仕組みですが、サブ・スレッドを使用すると言う事実は変わりません。(その事実を明確にしないまま書かれている記事もあるのでご用心。)

GUIコントロールは一般にスレッドセーフではないので、例えば関数(a)をawaitで実行した場合、サブ・スレッドで実行されます。そして、その関数(a)から戻る時にawaitによりメイン・スレッドへ同期されるため、戻った後ならGUIコントロールを変更できます。(昔のInvokeを使う方法に比べると本当に楽になってます。)しかし、関数(a)の中では通常GUIコントロールを変更してはいけませんのでご注意下さいね。
(もちろん、GUIコントロールだけでなく、スレッドセーフでない全てのリソースについて要注意です。)

投稿2016/02/12 07:30

編集2016/02/18 08:01
Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問