0

objectsとをTCP使っC#て受信しようとしていserializationます。私はobjects常に受信しており、それぞれobjectが新しいタスクに送信されます。threads高すぎるので使わないことにしました。問題は、一度に 1 つしか受信していない場合はobjectすべて問題なく動作しますが、複数の 1 を受信しようとするとobject、数秒後に次のようになることです。 "the input stream is not a valid binary format. the starting contents (in bytes) are: ..."

これは私のリスニング機能です:

public void Listen()
        {
            try
            {
                TcpObject tcpObject = new TcpObject();
                IFormatter formatter = new BinaryFormatter();

                bool offline = true;
                Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
                    new Action(() => offline = Offline));

                while (!offline)
                {
                    tcpObject = (TcpObject)formatter.Deserialize(serverStream);

                    if (tcpObject.Command == Command.Transfer)
                    {
                        #region Task
                        Task.Factory.StartNew(() =>
                        {
                            SentAntenna sentAntenna = (SentAntenna)tcpObject.Object;

                            string antennaName = sentAntenna.Name;

                            if (MainWindow.SpectrumList.ContainsKey(antennaName))
                            {
                                PointCollection pointCollection = new PointCollection();
                                float minChan = sentAntenna.Min;
                                float maxChan = sentAntenna.Max;

                                if (MainWindow.SpectrumList[antennaName].spectrumViewModel.AbsoluteMinimum == -1)
                                {
                                    Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
                                        new Action(delegate
                                        {
                                            MainWindow.SpectrumList[antennaName].spectrumViewModel.AbsoluteMinimum = minChan;
                                            MainWindow.SpectrumList[antennaName].spectrumViewModel.AbsoluteMaximum = maxChan;
                                            MainWindow.SpectrumList[antennaName].spectrumViewModel.TBMinRange = minChan.ToString();
                                            MainWindow.SpectrumList[antennaName].spectrumViewModel.TBMaxRange = maxChan.ToString();
                                            MainWindow.SpectrumList[antennaName].spectrumViewModel.MinRange = minChan;
                                            MainWindow.SpectrumList[antennaName].spectrumViewModel.MaxRange = maxChan;
                                            MainWindow.SpectrumList[antennaName].spectrumViewModel.UpdateRange();
                                        }));
                                }

                                float gap = maxChan - minChan;
                                foreach (Frequency f in sentAntenna.Frequencies)
                                {
                                    float chan = ((f.Channel - minChan) / gap) * 310;
                                    float inten = ((f.Intensity - 1) / 599) * 100;
                                    pointCollection.Add(new Point(chan, inten));
                                }

                                pointCollection.Freeze();
                                Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
                                    new Action(() => MainWindow.SpectrumList[antennaName].spectrumViewModel.AllAntennaPoints = pointCollection.Clone()));
                            }
                            Thread.Sleep(50);
                        });
                        #endregion
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message); // raise an event
            }
        }

私は何を間違っていますか?

4

2 に答える 2

0

移動してみてください

SentAntenna sentAntenna = (SentAntenna)tcpObject.Object;

StartNew()の前の行に。これで問題が解決すると思います。

tcpObjectはすべてのタスクに対してグローバルであるため、tcpObjectへの同時アクセスは必要ないと思います。

または、whileループ内でTcpObjectをインスタンス化して、各タスクに対してローカルに保つこともできます。

于 2013-01-29T18:05:55.827 に答える
0

このエラーにはいくつかの理由があります。

  1. 2 つのオブジェクトが 1 つの接続に同時に書き込む場合

  2. serverStream で何か問題が発生した場合: ストリームがデータの一部を受信したか、長さ 0 のデータを受信しました

  3. tcpObject に同時にアクセスします。それは悪い考えです。

于 2013-01-29T18:28:06.793 に答える