
実現したいこと
StreamWriterでデータをCSVに書き込めるようにしたい
環境
Windows10 Pro(バージョン 21H2)
Microsoft Visual Studio Community 2022 (64 ビット) - Current
Version 17.6.2
WinFormsにて作成しています。
.net7.0
試したこと
昨日まで動いていたが、今日になって動かなくなった
3日前にZIPで送ったコードが残っていたので解凍してそのコードを実行しても動かない
昨日寝る前にVisual Studioのアップデートを行って寝ました。
下記のコードは、メインのコードからCSV部分だけを抜き出してテストで再構築したコードです。
そこで解った事は、54行目のTask.Delay(1000).Wait();を消すと一気にデータが書き込まれてデータは正常に書き込まれるが
Task.Delay(1000).Wait();を追加すると見た目は動いているが実際はヘッダー行すらデータが書き込まれない状況です。
そもそも、私のコードが悪くてタマタマ動いていたのか?アップデートの影響で動かなくなったのか?教えていただきたいです。
知りたいこと
アップデートの影響ならば、ダウングレードの方法が知りたいです。
codeが悪いのであれば、指摘よろしくお願いします。
code
C#
1//プログラム実行 2Task t1 = Task.Run(() => { main_system(label1, textBox1, progressBar1, ref Flags.Cancel_Flag1, ref Flags.End_Flag1); }); 3 4//実行部分 5private void main_system2(Control label, Control textbox, ProgressBar progressBar, ref bool Cancel_Flag, ref bool End_Flag) 6 { 7 if (textbox.Text == "") 8 { 9 MessageBox.Show("CSVファイルを選択してください。"); 10 } 11 else 12 { 13 string inputFile = textbox.Text; 14 string file_name = Path.GetFileName(inputFile); 15 DateTime dt = DateTime.Now; 16 String Output_File_Name = dt.ToString($"{dt:完了_HH-mm-ss_}") + file_name; 17 string main_folder = System.IO.Directory.GetCurrentDirectory(); 18 string outputFile = main_folder + "\\" + Output_File_Name; 19 20 // Shift JISで書き込むためのエンコーディングを取得 21 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 22 Encoding enc = Encoding.GetEncoding("sjis"); 23 24 // CSVファイルを読み込む 25 string[] lines = System.IO.File.ReadAllLines(inputFile, enc); 26 27 28 // ヘッダー行を取得 29 string headerLine = lines[0]; 30 int max_line = lines.Length - 1; 31 32 //別スレッドからコントロールを操作する場合はInvokeを使う 33 this.Invoke(new Action(() => 34 { 35 //プログレスバー初期化 36 progressBar.Minimum = 0; 37 progressBar.Maximum = max_line; 38 progressBar.Value = 0; 39 })); 40 41 42 43 44 // 書き込み用のファイルを作成 45 using (StreamWriter writer = new StreamWriter(outputFile, false, enc)) 46 { 47 48 // ヘッダー行を追加 49 writer.WriteLine(headerLine + ",判定結果"); 50 // データ行を書き込む 51 for (int i = 1; i < max_line + 1; i++) 52 { 53 54 Task.Delay(1000).Wait(); //sleep 55 //別スレッドからコントロールを操作する場合はInvokeを使う 56 this.Invoke(new Action(() => 57 { 58 //ステータス更新 59 label.Text = String.Format("{0}/{1}件", i.ToString(), max_line.ToString()); 60 progressBar.Value = i; 61 })); 62 63 // カンマで区切られたデータを分割 64 string[] values = lines[i].Split(','); 65 string hantei = i.ToString(); 66 try 67 { 68 this.Invoke(new Action(() => 69 { 70 label.Text = "CSV書き込み中"; 71 })); 72 writer.WriteLine(string.Join(",", values) + "," + hantei); 73 74 } 75 catch 76 { 77 MessageBox.Show("CSVファイルが開かれています、閉じてください。"); 78 writer.WriteLine(string.Join(",", values) + "," + hantei); 79 } 80 81 } 82 } 83 } 84 }






回答1件
あなたの回答
tips
プレビュー