同時に処理しなければならないものがあったため、vb.netでスレッド処理を作った。
いくつか引数を渡すために思いついたのは、スレッドに直接引数を渡すのではなく、一旦スレッド生成用のクラスを用意して、そこでインスタンスを生成するように実装した。
で、デバグしておづさ確認したうえで、リリースしてみると、あら不思議。
データが合ったり合わなかったりと挙動が不自然だ。
スレッドクラスでは文字列を操作して引き渡すのだが、モノ文字列が同時に実行したスレッドのいものになってしまう。
ストリングはもちろんnewされたクラスの中のデータなので同じわけはない。
で、実行プログラムにログを入れてみる。
クラスのNew時点では新しいデータが渡されている
スレッド生成した部分からでも新しいデータのままである。
も新しいデータから文字列を書こうする処理でいきなり古い文字列の取得した結果になってしまう!(ぶっちゃけMid関数)
参照状態は新しいでーたのままなのにだ。
でMidをやめて、removeとsubstringとinsertに替えた。
そうすると今度はSplitが処理されなくなった・・・ SplitはMidとか行っていたさらに上の部分だったのに、なぜそこに影響する?
処理として同じ位置に実装しているファイル操作などはスレッド内で正しく動作している。ところが文字列操作だけが挙動がおかしい。
ありえない・・・・
文字列操作関数ってスレッドセーフでないのか?
追記:
後日冷静になってからもう一度みる。
Splitはパニックになって違う変数見ていただけだった。
文字列としては完全な別インスタンスなのも確認したが、文字列加工処理後でおかしくなっていた。結局スレッドのスタートを1msずらすことで対処。 netの信頼度を下げる出来事だった。