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

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

ただいまの
回答率

90.51%

  • C#

    7147questions

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

非同期処理の処理順序について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 407

C#で重い処理を非同期で動かしたいのですが、
その処理が順番が入れ替わってしまってはいけないものだとすると
非同期処理は使えないのでしょうか。

例えば例えばフォルダA、B、Cがあり、それぞれファイルが10個ずつ入っていたとします(a0~a9.csv,b0~b9.csv, c0~c9.csv)。
フォルダをコピー(A',B',C')して、ファイルごとにある処理をさせて、処理結果をまとめたファイル(aSummary.csv, bSummary.csv, cSummary.csv)を作成し、コピーフォルダに保存するという作業を行いたいとします。
ただ、非同期(ParallelやTask)では早く完了した順に結果を返してしまうと思います。
そこをA~Eの順は守りつつ、処理自体は非同期で行うことはできるのでしょうか。

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • MMashiro

    2018/04/16 16:46

    本文が記述できていません、質問内容の再確認をお願い致します

    キャンセル

  • yaneuranoneko

    2018/04/16 17:46

    質問が漠然としていたみたいで削除されてしまったので、改めて記述しました。

    キャンセル

回答 4

+4

それ以前にこの問題の場合、複数のスレッドから同時に複数のファイルにアクセスすることになると思いますが、対象が HDD や DVD などなら高速化どころか低速化します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 09:52

    回答ありがとうございます。私自身はSSDを使用していますが、もちろんHDDでも使用することはあります。HDDだと低速化するのであれば難しいですかね。

    キャンセル

checkベストアンサー

+1

こんにちは。

フォルダA~Eへの処理がそれぞれTaskになっていると仮定すると、
全てのTaskを起動した後、任意の順序でコレクションに詰め、Task.WhenAllメソッドを呼び出しawaitすることで目的を達成できます。

{
    var taskA = TaskAsync(A); // awaitしないことでバックグラウンド動作させる
    var taskB = TaskAsync(B);
    var taskC = TaskAsync(C);
    // ...

    var result = await Task.WhenAll(taskA, taskB, taskC); // resultはA,B,Cの順に並んだTaskの実行結果の配列となる
}


実際にはループで処理することになると思われますが、「Taskの配列」をTask.WhenAllで同時に待機するという流れは変わりません。


ところで、
フォルダへのアクセスというと、おそらくは物理ディスクに対するIOでしょうけど、並列実行したところでディスクのアクセスはシーケンシャルなので実行速度は逆に低下します。
並列実行がパフォーマンスに効果を発揮するのは、マルチコアCPUに対して計算処理を当てる場合と、待ちが発生するIO処理中に他のCPU処理を行う場合のみです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 09:57

    回答ありがとうございます。やりたいことはそのコードのようなことかもしれません。ただ、Zuishinさんの回答にもある通り、パフォーマンスが逆に低下してしまうようなら、現状の処理で時間がかかるのは仕方ないのかなと思ってしまいます。

    キャンセル

+1

参考までに
Task.ContinueWithを使用すれば順番に処理させることは可能です。
ですがこのやり方だと結局順番に処理を待つことになりますので、処理の効率化にはつながりません。
効率まで加味するのであれば、スレッド間で同期をとってやるなど工夫が必要と思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 09:50

    回答ありがとうございます。効率化とやりたいことは逆のことをやろうとしているのかもしれませんね。参考にさせて頂きます。

    キャンセル

-1

イベントやらセマフォ使えば順序は揃えられるだろうけど、非同期にする意味なくない?


ここでいうイベントってのはManualResetEventとかそっちのはなしね

まあ、並行して実行できるもんをPalalellで非同期に実行させて、それの終了待ちして、次の処理群を非同期で実行させる、、、というかんじでいいんじゃね?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 09:48

    回答ありがとうございます。すみません初心者なもので、非同期にする必要がそもそもあるのかを再検討する必要があるかもしれません。セマフォというのは初めて聞いたので調べてみます。

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    [PHPExcel] CSVファイルのインポート・エクスポート

    PHPExcelを使ってExcelかCSVファイルにエクスポート(あるいはインポートする)例を教えてほしいです。 できればサンプルのコードがあると助かります。

  • 受付中

    大量データ処理について

    ショッピングサイトのエンジニアをやってます。 以下質問がございます。 ①月の受注データ(10万件ほど)をselectして、 ②別に読み込んだcsvファイルのデータと1件ずつ突合チ

  • 受付中

    mysql;csvファイルの読み込み

    mysqlで以下のようなcsvファイルを読み込ませたいです. 00000xx_000000x,http://・・・,,,,, 00000xx_000000x,http://・・・

  • 受付中

    mysql;複数ファイルのインポート

    mysqlに複数のファイルを読み込ませたいです. testテーブルに001,002,003,...nnnというファイルをインポートしたいのですが,ひとつずつやっていくのは手間なので

  • 解決済

    Cakephp v2.6 でPHPWordを導入したい

    Webサイトから帳票を印刷するにあたって、 PHPwordの導入を検討しています。 https://github.com/PHPOffice/PHPWord.git これ

  • 解決済

    CSVファイルを開いたときに文字化けします。

    メール送信した内容をcsvで開いて、excelではに文字化けが生じてます。 あってるかどうかはわかりませんが、一応文字化けを防ぐためのものを入れてあります。(ぐぐって見つけたもの

  • 解決済

    CSVファイルに改行しつつ文字列を書き込みたい

    皆様いつもお世話になっております。 乱数を出力して、一定時間ごとにテキストに改行しつつそれを書き込みたいのですが、改行されずに一行の文字列だけが出力されてしまって困っています

  • 解決済

    rubyで複数のcsvファイルを連結させつつ、重複は排除する

    複数のcsvファイルを1つの新しいcsvファイルにしてidが重複するものは一つにまとめるというrubyファイルを作成したいのですが どのようにすればいいのかさっぱりわかりません。

同じタグがついた質問を見る

  • C#

    7147questions

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