Câu hỏi của tôi là, trong đoạn mã dưới đây, tôi có thể chắc chắn rằng các phương thức thể hiện sẽ truy cập vào các biến mà tôi nghĩ, hoặc chúng có thể bị thay đổi bởi một chuỗi khác trong khi tôi vẫn đang làm việc ? Việc đóng cửa có liên quan đến điều này không, tức là tôi sẽ làm việc trên một bản sao cục bộ của IEnumerable<T>
vì vậy việc liệt kê có an toàn không?Đa luồng, lambdas và biến cục bộ
Để diễn giải câu hỏi của tôi, tôi có cần bất kỳ khóa nào nếu tôi không bao giờ viết cho các biến được chia sẻ không?
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;
}
}
}
Bạn có thể chia sẻ việc triển khai CustomerDataContext không? Đây có vẻ là nơi duy nhất mà một cuộc đua dữ liệu hiện có thể xảy ra. –
CustomerDataContext là một DataContext của Entity Framework chuẩn và thực sự là một luồng địa phương, do đó không có các cuộc đua dữ liệu ở đó. –