私の最初の目的は、TCPストリームを通してリストを非同期で送信することです。しかし、非同期スレッドにリストを渡した直後に、新しいデータでもう一度それを埋めるために、それをクリアする必要があります。だから私は、リストのコピーを作成するために、浅いクローニングを使用し、バックグラウンドスレッドに渡し:元のリストがクリアされた場合、浅いクローンリスト内の項目はどうなるでしょうか?
private List<MyDataObject> GetShallowCloneOfDataList(List<MyDataObject> dataEvents)
{
return new List<MyDataObject>(dataEvents);
}
、ここでは私の最終的なコードです:
List<MyDataObject> data = new List<MyDataObject>();
while(hasMoreData)
{
data.clear();
FillListFromServer(data);
List<MyDataObject> clonedList = GetShallowCloneOfDataList(data);
Task.Run(() => SendDataList(clonedList));
}
私がクリアしたときに私の質問は、あります元のリストdata
、クローンリスト内のアイテムも影響を受けますか?私のコードをテストすると、影響を受けていないことが明らかになりましたが、大量のデータ(毎秒200K)を処理するときにこれが真実であるかどうかはわかりません。
参照型とは何か – mybirthname
あなたの質問(以下に回答)とは別に、リストのクローンをSendDataListに渡して自分のリストをクリアするのはなぜですか?なぜ元のリストを関数に渡さないのですか?このオリジナルのリストにもう触れずに新しいリストを記入してください。はるかに効率的ですね。 –
@HaraldCoppoolse、確かにこれはより効率的ですが、残念ながら状況は上記のコードスニペットよりはるかに複雑です。元のリストは、データサーバーからプッシュされたイベントで新しいデータを埋め込むオブザーバークラスにアプリケーションの開始時にフックされるので、新しいリストを作成することはできません:( –