Sorum şu ki, aşağıdaki kodda, örnek yöntemlerin benim çalıştığımı düşündüğüm değişkenlere erişebileceğinden emin olabilir miyim, yoksa hala çalışıyorken başka bir iş parçacığı tarafından değiştirilebiliyor olabilir ? Kapatmaların bununla bir ilgisi var mı, yani IEnumerable<T>
'un yerel bir kopyası üzerinde çalışıyorum, böylece numaralandırma güvenli midir?Çoklu öge, lambda ve yerel değişkenler
Sorumu açıklamak gerekirse, paylaşılan değişkenlere hiç yazmamam gereken kilitlere ihtiyacım var mı?
public class CustomerClass
{
private Config cfg = (Config)ConfigurationManager.GetSection("Customer");
public void Run()
{
var serviceGroups = this.cfg.ServiceDeskGroups.Select(n => n.Group).ToList();
var groupedData = DataReader.GetSourceData().AsEnumerable().GroupBy(n => n.Field<int>("ID"));
Parallel.ForEach<IGrouping<int, DataRow>, CustomerDataContext>(
groupedData,
() => new CustomerDataContext(),
(g, _, ctx) =>
{
var inter = this.FindOrCreateInteraction(ctx, g.Key);
inter.ID = g.Key;
inter.Title = g.First().Field<string>("Title");
this.CalculateSomeProperty(ref inter, serviceGroups);
return ctx;
},
ctx => ctx.SubmitAllChanges());
}
private Interaction FindOrCreateInteraction(CustomerDataContext ctx, int ID)
{
var inter = ctx.Interactions.Where(n => n.Id = ID).SingleOrDefault();
if (inter == null)
{
inter = new Interaction();
ctx.InsertOnSubmit(inter);
}
return inter;
}
private void CalculateSomeProperty(ref Interaction inter, IEnumerable<string> serviceDeskGroups)
{
// Reads from the List<T> class instance variable. Changes the state of the ref'd object.
if (serviceGroups.Contains(inter.Group))
{
inter.Ours = true;
}
}
}
CustomerDataContext'in uygulamasını paylaşabilir misiniz? Bu, bir veri yarışının şu anda meydana gelebileceği tek yer gibi gözüküyor. –
CustomerDataContext, standart bir Entity Framework DataContext'tir ve aslında iş parçacığı yereldir, bu nedenle orada hiçbir veri yarışması yoktur. –