نوشته شده توسط
farhad_shiri_ex
به هر حال CLR نوع مقداری را در stack تعریف میکنه بنابراین در زمان تعریف مقدار حافظه لازم مثلا همون 4 بایت را رزرو میکنه حالا مقدارش هرچی میخواد باشه! چه 0 باشه وچه عدد 1-232
به نظرم بهتر بود که سورس مورد نظرتون را اینجا قرار می دادید! به نظرم دوتا راه حل داره!
1- اگر مصرف بهینه حافظه خیلی مهم هست! که بهتره از کد های unsafe به زبان ++C استفاده کنید.
2- می توانید حافظه لازم برنامه را روی heap تعریف کنید.
اگر شما در یک حلقه دارید داخل یک رشته هربار اطلاعاتی مینویسید به هرحال چه داخل حلقه و چه خارج از حلقه باید از این رشته اطلاعات استفاده کنید و مجددا رشته را خالی کنید قطعا می دونید که رشته ها آرایه هایی از بایت هستند و نکته دیگر هم اینکه در سی شارپ حتما بهتر هست که از stringBuilder استفاده کنید اونهم به این علت که کلاس string به صورت immutable تعریف شده در صورتی که قصد داشته باشید به رشته بایت جدیدی اضافه کنید CLR مجددا یک شی جدید و سازنده کپی را فراخوانی میکند که کار بهینه ای نیست به همین علت از کلاس stringBuilder استفاده کنید.
بنابراین اگر در یک حلقه در صورتی که تعریف ومقداردهی و عملیات بازپس گیری منابع چه توسط برنامه نویس و چه توسط GC به درستی انجام بشه افزایش تصاعدی استفاده از حافظه کمی غیر معقول به نظر میرسه اگر اینچنین هست باید سورس را حتما Trace کنید و به Unboxing / Boxing و عملیاتهای رشته ای و ... توجه داشته باشید.
سلام و تشکر بابت پاسخ گویی، این کدی هست که دارم:
private IResult<MediaList> media;
private string json;
private async void GetData(object state)
{
Debug.WriteLine(DateTime.Now);
media = await api.GetUserMediaAsync("ra.sad");
json = JsonConvert.SerializeObject(media.Value);
Debug.WriteLine(json);
}
این متد به وسیله تایمر برای گرفتن مدیای جدید از سایت مورد نظر فراخوانده می شود.
var stateTimer = new Timer(GetData);
stateTimer.Change(0, 300000);