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

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

新規登録して質問してみよう
ただいま回答率
85.49%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

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

Q&A

3回答

2093閲覧

スレッドセーフなcsvファイルの読み取り

panda21

総合スコア12

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

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

0グッド

1クリップ

投稿2018/10/21 13:59

前提・実現したいこと

C#の勉強を初めて半年ほどとなります。
現在windowsFormでソフトを開発しております。その際にCSVファイルの読み書きを行う必要があるのですが
データ量が多いためUIとは別のスレッドでファイルの読み書きをしたいと考えております。
StreamReader/Writerクラスのasync/awaitを使用したスレッドセーフなCSVファイルの読み書きの方法をご教示いただけますでしょうか。

該当のソースコード

C#

1static void ReadCsv() 2{ 3 try 4 { 5 // csvファイルを開く 6 using (var sr = new System.IO.StreamReader(@"test.csv")) 7 { 8 // ストリームの末尾まで繰り返す 9 while (!sr.EndOfStream) 10 { 11 // ファイルから一行読み込む 12 var line = sr.ReadLine(); 13 // 読み込んだ一行をカンマ毎に分けて配列に格納する 14 var values = line.Split(','); 15 // 出力する 16 foreach (var value in values) 17 { 18 System.Console.Write("{0} ", value); 19 } 20 System.Console.WriteLine(); 21 } 22 } 23 } 24 catch (System.Exception e) 25 { 26 // ファイルを開くのに失敗したとき 27 System.Console.WriteLine(e.Message); 28 } 29}

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

y_waiwai

2018/10/21 14:07

あなたのいうスレッドセーフとはどういうことでしょうか。ふつーに別スレッドで読み書きするのではダメなんでしょうか
退会済みユーザー

退会済みユーザー

2018/10/22 00:21

別スレッドにするそもそもの目的はなんですか? UI 応答性に問題があるのでそれを改善するという話ではなさそうに見えますが。全体的な処理時間の短縮を考えているとするとむしろ逆効果だと思います。
guest

回答3

0

ご提示のコードでも、同時に同じファイルをReadしようとすると例外が発生してファイルがオープンできないのでスレッドセーフではあります。
同時読込のみ許容する場合は、StreamReaderクラスではなくFileStreamクラスを使って FileShare を FileShare.Read にします。
同時書込みもしたい場合はメモリ マップト ファイルがお勧めです。
プロセス間ファイル共有用の仕組みのマネージ版ですから、スレッド間でも問題なく使えます。

スレッドセーフなメソッドが出来たら非同期メソッドは簡単ですが、一応書いておきます。

C#

1static async Task ReadCsvAsync() 2{ 3 await Task.Run((Action)ReadCsv); 4}

投稿2018/10/22 01:36

編集2018/10/22 04:01
hihijiji

総合スコア4150

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

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

0

目的は、時間がかかるファイル処理を平行して処理がしたいという意味ですよね?
その手段だとして、別スレッドがでてきたがスレッドセーフ問題がでてきた、
また、スレッドセーフ問題回避する為、async/awaitの非同期処理がでてきたということでしょうか。

このあたりを参考に
テキストファイルの内容を非同期的に読み込むには?

投稿2018/10/22 03:47

tmp

総合スコア277

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

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

0

普通に読めばいいです。
読みながら別のスレッドから書き込みたいならかなり苦労しなければいけません。スレッドセーフな読み書きをしようと思えば、一時ファイルやデータベースを使ってやりくりしなければいけませんが、読むだけならどうぞご自由に。

ただし、読んだ後のデータをコントロールに渡すには Control.Invoke を使って UI スレッドに移らなければいけません。コントロールを他のスレッドから触ることはできません。

投稿2018/10/21 14:26

Zuishin

総合スコア28660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問