Здравструйте.
В моём классе используются низкоуровневые объекты. Если я правильно понял, можно забить на их своевременное уничтожение и просто прописать это в деструкторе. В этом случае, сборщик мусора сам всё освободит, когда время настанет. Только вот, это как-то странно работает. Вот, собственно, сам класс:
public class TwitchStreamInfo
{
public string title;
public string videoId;
public string streamId;
public string videoUrl;
public DateTime length;
public int viewCount;
public DateTime dateCreation;
public DateTime dateDeletion;
public string imagePreviewTemplateUrl;
public string imageAnimatedPreviewUrl;
public Stream imageData = null;
public bool isPrime;
public string infoStringJson;
~TwitchStreamInfo()
{
if (imageData != null)
{
imageData.Dispose();
}
System.Diagnostics.Debug.WriteLine($"{ToString()}: {title}, {userInfo.DisplayName} is free");
}
}
Вот так создаётся:
private int ParseVideosListJSON(string aJsonString)
{
JObject json = JObject.Parse(aJsonString);
JToken jToken = json.Value<JToken>("videos");
if (jToken == null) //false
{
TwitchStreamInfo stream = ParseStreamInfo(jToken.Value<string>());
}
else
{
JArray jsonArr = jToken.Value<JArray>();
for (int i = 0; i < jsonArr.Count; i++) //в массиве один элемент
{
lbLog.Items.RemoveAt(lbLog.Items.Count - 1);
lbLog.Items.Add("Обработка данных... " + (i + 1).ToString() +
" / " + jsonArr.Count.ToString());
TwitchStreamInfo streamInfo = ParseStreamInfo(jsonArr[i].ToString());
streams.Add(streamInfo);
FrameStream frameStream = new FrameStream();
frameStream.Parent = panelStreams;
frameStream.Location = new Point(0, 0);
frameStream.OnActivate += Event_FrameStreamEvent_Activate; //названия названы не по фен-шую
frameStream.OnImgMouseDown += StreamImageMouseDown;
frameStream.DownloadButtonPress += Event_DownloadButtonClick;
frameStream.BackColor = FrameStream.colorInactive;
frameStream.SetStreamInfo(ref streamInfo);
framesStream.Add(frameStream);
Application.DoEvents();
}
}
return streams.Count;
}
public static TwitchStreamInfo ParseStreamInfo(string jsonString)
{
TwitchStreamInfo stream = new TwitchStreamInfo();
JObject json = JObject.Parse(jsonString);
//тут парсинг
return stream;
}
Вроде как, создаётся только один экземпляр класса. Однако, при закрытии программы, в дебаг-лог выводится это:
"TwitchPrimeDownloader.exe" (CLR v4.0.30319: TwitchPrimeDownloader.exe). Загружено "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_ru_b77a5c561934e089\mscorlib.resources.dll". Сборка модуля выполнена без символов.
TwitchPrimeDownloader.Utils+TwitchStreamInfo: , is free
TwitchPrimeDownloader.Utils+TwitchStreamInfo: Being ugly : My Experience, Miramisu is free
Программа "[86488] TwitchPrimeDownloader.exe" завершилась с кодом 0 (0x0).
То есть, деструктор вызывается два раза. Один раз с пустыми полями, второй раз с правильными.
А если убрать строчку
streams.Add(streamInfo);
тогда всё правильно. Вызывается один раз. Не пойму, откуда берётся второй экземпляр с пустыми полями