ConcurrentDictonary to IQuerable<T> - Безопасность потока
Я предполагаю, что та же логика из этого вопроса также относится к следующему фрагменту кода? Это означало бы, что перечислитель никогда не будет снимком во времени, и поэтому потребуется дополнительный примитив синхронизации. Это, конечно, не относится, если я взаимодействую со словарем напрямую.
public class InMemoryUserStore<TUser> :
IQueryableUserStore<TUser>
where TUser : User
{
private readonly ConcurrentDictionary<string, TUser> _users = new ConcurrentDictionary<string, TUser>();
#region IQueryableUserStore<TUser>
/// <summary>
/// Return the dictionary as a <see cref="IQueryable{TUser}"/>.
/// </summary>
public IQueryable<TUser> Users => _users.Values.AsQueryable();
#region CRUD
/// <summary>
/// Find a user by id.
/// </summary>
public Task<TUser> FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken))
{
var user = Users.FirstOrDefault(u => u.Id == userId);
if (user != null)
{
return Task.FromResult(user);
}
return Task.FromResult<TUser>(null);
}
}