スレッドを使用してプログラムから複数のクライアント(PLC)に接続しています。プログラムはデータを送信し、PLCからの応答を受信します。デバッグモードでは(ブレークポイントをトグルする)、一度に1ステップずつプログラムが正常に動作します。それは、スレッドの1から来ています..しかし、私はただのブレークポイントを切り替えずにデバッグする場合に、応答イベントがCのスレッドモードからの適切なコールバック
Debugging mode with breakpoint:
...間違っている可能性がどのような...別のスレッドでも、同じIDを受信します以下は Debugging mode without breakpoint:は私のコード
開始要求である:
private void StartRequest()
{
foreach (ModbusTCP work in works)
{
work.Connect();
Thread.Sleep(1000);
if (work.Connected)
{
try
{
Thread thread = new Thread(new ThreadStart(() => work.StartReadHoldingRegister())) {
Name = ((ReadHoldingRegisterParam)work.SetReadHoldingRegisterParam).id.ToString(),
IsBackground = true
};
work.OnResponseEvent += new EventHandler<ModbusTCP.ResponseEventArgs>(modbus_OnResponseEvent);
work.OnExceptionEvent += new EventHandler<ModbusTCP.ExceptionEventArgs>(modbus_OnExceptionEvent);
thread.Start();
threads.Add(thread);
}
catch (ThreadStateException ex)
{
MessageBox.Show(ex.Message);
}
}
else
work.Disconnect();
}
}
応答イベント
private void modbus_OnResponseEvent(object sender, ModbusTCP.ResponseEventArgs e)
{
lock (lockingObject)
{
if (e.data.Length > 0)
{
this.Dispatcher.BeginInvoke(new Action(() =>
{
AddRow(RcvDataGrid, new PLCPacket() {
PLCId = e.id.ToString(),
PLCIp = "Test",
PLCTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss tt"),
PLCData = ""
});
}));
}
}
}
私はあなたのポイントを参照してください、実際にはロックはそこに始まっていませんでした。私はこの問題を解決しようと必死になっていて、どこでもロックを無作為に入れようとしていました。厄介なことに、私が見逃してしまったことに気づかなかったという良い説明が出てきます... **スレッドが実行されると、あなたの可変作業は** – mysayasan