مورد عجیب NET ConcurrentDictionary. و Closures
نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۱۲/۰۶ ۰۸:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
ConcurrentDictionary.GetOrAdd را توضیح میدهد. Closures میتوانند باعث تخصیصهای ناخواسته، مشکلات همزمانی و نشت حافظه شوند.void SayHello(string name)
{
var hello = () =>
{
Console.WriteLine($"Hello {name}"); // name گرفته شده است
};
hello();
}ConcurrentDictionary.GetOrAdd اگر به درستی استفاده نشود، میتواند closures ایجاد کند.var result = concurrentDictionary.GetOrAdd(key, (k) => {
Console.WriteLine($"Building {k}");
return new Item(value, DateTime.Now); // value گرفته شده است
});value، گرفته شده و یک closure ایجاد میکند.ConcurrentDictionary.GetOrAdd یک overload دارد که از closures جلوگیری میکند:var result = concurrentDictionary.GetOrAdd(
key: key,
valueFactory: (k, arg) => // arg آرگومان factory را دریافت میکند
{
Console.WriteLine($"Building {k}");
return new Item(arg, DateTime.Now);
},
factoryArgument: value); // مستقیماً به عنوان یک آرگومان ارسال میشود