C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: IF文終了後にElseに飛んでしまう


(過去ログ 176 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■101098 / inTopicNo.1)  IF文終了後にElseに飛んでしまう
  
□投稿者/ ゆうたろう (11回)-(2023/01/06(Fri) 17:32:15)

分類:[.NET 全般] 

お世話になります。
当方VB.net(VS2015 .Net4.5.1)で開発をしております。

DGVからデータを読み込み、読み込み後には完了マークを付ける
というプログラムがあるのですが、
未読み込みのデータのみ表示させた上で、2つ以上同時に読み込ませるとエラーが起きました。
全てのデータを表示させて読み込ませるとうまくいきます。

不具合の該当箇所はこちらです

 If ret Then '途中で処理をキャンセルされるとretがFalseに

(〜ここで処理列の読み込みフラグをTrueに〜)

  frmResult.setSuccessStep()
 Else
  Throw New Exception(中断されたデータ)
 End If

この処理を読み込む列の回数繰り返すという全体の処理になっていますが、
Trueで進みEnd IFまで進み、ステップ実行をすると、Throw New Exceptionに進みます。
このときretはTrueのままでした。

@条件式がTrueなのにElseを通っているということでしょうか?
AなぜElse自体を通らずその下に直接行くのでしょうか
Bおそらく読み込みフラグをTrueに変える処理と、読み込み済みは表示しない処理の兼ね合いでのエラーだと思うのですが、非同期処理でもないのに同時進行でかかわってくることはあり得るのでしょうか?

拙い説明で申し訳ありませんが、何か解決の糸口になりそうなことがあれば
お教えいただければ幸いです。
引用返信 編集キー/
■101099 / inTopicNo.2)  Re[1]: IF文終了後にElseに飛んでしまう
□投稿者/ ゆうたろう (12回)-(2023/01/06(Fri) 17:38:01)
表示させているプログレスバーだけ非同期かもしれないです。
引用返信 編集キー/
■101100 / inTopicNo.3)  Re[1]: IF文終了後にElseに飛んでしまう
□投稿者/ 魔界の仮面弁士 (3523回)-(2023/01/06(Fri) 17:58:56)
2023/01/06(Fri) 18:23:01 編集(投稿者)

No101098 (ゆうたろう さん) に返信
> 未読み込みのデータのみ表示させた上で、2つ以上同時に読み込ませるとエラーが起きました。
このエラーとは「Throw New Exception(中断されたデータ)」のことですか?


> 全てのデータを表示させて読み込ませるとうまくいきます。
DataSource なしの DataGridView に、直接値を書き込んでいるのでしょうか。
それとも、バインドしている DataTable に保持させているのでしょうか。
(セルに直接書き込むのは、パフォーマンス的にあまり望ましくはありません)

DataTable をバインドしているのであれば、データの書き込みは DataGridView に対してではなく、
バインド先の DataTable あるいは BindingSource に対して行うのが望ましいです。


>  If ret Then '途中で処理をキャンセルされるとretがFalseに
その ret はどこで宣言されていますか?

ローカル変数ではなくフィールド変数であり、
他のイベントによって書き換えられる、ということでしょうか。

同じ変数を複数のスレッドから書き換えていたりはしないですよね?
(たとえば、BackgroundWorker からフィールド変数を書き換えているなど)


>  Else
>   Throw New Exception(中断されたデータ)
>  End If
流石に、素の Exception を Throw するのは如何なものかと思いますよ。
Catch しにくくなりますので、面倒がらずに独自のカスタム例外を投げましょう。
(事前定義済みの適切な例外クラスがある場合は、独自例外を設ける必要はありません)

[標準例外型の使用]
https://learn.microsoft.com/ja-jp/dotnet/standard/design-guidelines/using-standard-exception-types


[例外の推奨事項]
https://learn.microsoft.com/ja-jp/dotnet/standard/exceptions/best-practices-for-exceptions


> このときretはTrueのままでした。
不要部分を削ぎ落した、現象を再現できる最低限の実験コードまたはサンプルを提供できますか?
その場合、Option Strict を On にした状態でコンパイルが通る状態であることが望ましいです。


> @条件式がTrueなのにElseを通っているということでしょうか?
通常は起きないですね。

もしもマルチスレッドであれば、If を通過した時点では True だったものが、
Throw 時点で False になってしまうことはありますが、そういうケースでは、
排他制御処理を伴った設計にするのが普通ですし。
(マルチスレッドなのに、排他制御無しで書き換えているなら要修正)


あるいは、デバッグソースが古くなっているとか、プロジェクトの名前やフォルダーの変更などによって、
実際の実行個所とコードの行が不一致を起こしてしまうというケースが稀にあります。

たとえば「現在のソース コードは ... に組み込まれたバージョンとは異なっています」
などの警告が生じているケースがこれに当たります。
不一致の場合は、ソリューションの「クリーン」を行い、あらためて
ビルドしなおして改善するかを確認してみてください。

https://learn.microsoft.com/ja-jp/visualstudio/debugger/troubleshooting-breakpoints?view=vs-2022
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -