Moje pytanie brzmi, w poniższym kodzie, mogę mieć pewność, że metody instancji będą miały dostęp do zmiennych, które moim zdaniem będą, lub czy mogą zostać zmienione przez inny wątek, podczas gdy wciąż pracuję ? Czy zamknięcie ma coś wspólnego z tym, tzn. Czy będę pracował nad lokalną kopią IEnumerable<T>
, więc wyliczenie jest bezpieczne?Wielowątkowość, lambda i zmienne lokalne
Parafrazując moje pytanie, czy potrzebuję żadnych zamków, jeśli nigdy nie piszę do wspólnych zmiennych?
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;
}
}
}
Czy możesz udostępnić implementację CustomerDataContext? Wydaje się, że jest to jedyne miejsce, w którym obecnie może się odbywać wyścig danych. –
CustomerDataContext to standardowy obiekt DataContext środowiska Entity, a w rzeczywistości jest to wątek lokalny, więc nie ma tam danych. –