Pull to refresh
7
0
Евгений @ekulakov

User

Send message
Разговор конечно о многопоточности.
Тут немного по теме: http://codeblog.jonskeet.uk/2015/01/30/clean-event-handlers-invocation-with-c-6/
1) if (this.PropertyIsChanged != null) { this.PropertyIsChanged.Invoke(); — это кусок кода обязательно необходим, поскольку в противном случае, можно нарваться на nullReference-исключение.

И в этом случае тоже может быть null ref, потому что после проверки последний подписчик может отписаться от события.

Поэтому правильней делать так:
    EventHandler handler = this.PropertyIsChanged;
    if (handler != null)
    {
        handler(this, EventArgs.Empty);
    }

Вы не правильно поняли.
Это логическое продолжение Durandal написанное на ES6 и ES7 и использующее их фичи, собранное под «evergreen» браузеры. Так же они выкинули Knockout и написали свои байндинги, на подобии тех, что есть в Angular (используются Object.observe и Array.observe, если доступны, иначе dirty checking).
Я понимаю что у вас есть некие потребности. У меня, например, таковых нет.
Этот фреймворк можно рассматривать как WPF для веб. MVVM, Two way binding, Value converters. Вот это всё.
Мне, например, кажется странным желание рендерить XAML на сервере.
Тут решаются другие задачи. Люди пытаются довести разработку веб приложений до уровня разработки десктопных приложений.
Их цель, имхо, это enterprise, с кучей CRUD и горой кода.
Это клиентский фреймворк. Задача рендерить на сервере перед ним не ставится.
В данный момент не понятно, потому что это превью
Универсальный велосипед
public static class Execute
{
    private static Action<Action> executor = action => action();

    public static void InitializeWithSynchronizationContext()
    {
        var context = SynchronizationContext.Current;
        if (context == null)
        {
            throw new InvalidOperationException("Unable to initialize synchronization context");
        }

        executor = action =>
        {
            if (Equals(context, SynchronizationContext.Current))
            {
                action();
            }
            else
            {
                SendAction(context, action);
            }
        };
    }

    public static void OnUIThread(this Action action)
    {
        executor(action);
    }        

    private static void SendAction(SynchronizationContext context, Action action)
    {
        ExceptionDispatchInfo exceptionDispatchInfo = null;

        context.Send(state =>
        {
            try
            {
                action();
            }
            catch (Exception ex)
            {
                exceptionDispatchInfo = ExceptionDispatchInfo.Capture(ex);
            }
        }, null);

        if (exceptionDispatchInfo != null)
        {
            exceptionDispatchInfo.Throw();
        }
    }
}

Это часть запроса. Сгенерируется sql, который вытащит первую из уникальных строчек.
В общем, я бы аггрегировал информацию в базе и вытаскивал уже готовые уникальные значения.
А просто Distinct() не работает? На сколько я понимаю, EF реализует Identity Map, так что каждая сущность загрузится только один раз (с одним Primary Key) и стандартный EqualityComparer, который сравнивает референсы, должен сделать свою работу.

Если не работает или Вам нужен Distinct по проекциям, то можно попробовать вот такие методы:
Code
List<Person> distinctPeople = allPeople
  .GroupBy(p => p.PersonId)
  .Select(g => g.FirstOrDefault())
  .ToList();


List<Person> distinctPeople = allPeople
  .GroupBy(p => new {p.PersonId, p.FavoriteColor} )
  .Select(g => g.FirstOrDefault())
  .ToList();


Вызовите AsNoTracking() на датасете (если Вам не нужно кеширование\трекание изменений) и получите еще прибавку в производительности: по моим подсчетам раза в 2-3 (на 10к сущностей).
Конечно, TPL DataFlow пригодится там, где процесс выглядит куда сложнее. Это простой пример, но он показывает, как, не напрягаясь, ограничить использование памяти, нагрузить процессор и легко синхронизировать обработанные данные.

Вы уже второй, кто говорит, что без этого было бы проще. Я бы с радостью посмотрел на простое решение с использованием async\await.
В этом примере тоже можно добавить async\await, чтобы не занимать даже один поток на чтение\запись.
Присоединяюсь к тем, кто считает, что валидировать надо данные, а не контролы. Тут лежит старый проект Jeremy Miller (автор StructureMap), который позволяет валидировать данные используя атрибуты и кастомный интерфейс. Как получить из этого помидоры на контролах — другой вопрос, который, впрочем, тоже решается решением, частью которого является эта валидация (тут).
Начало падать, поэтому поставил. Поставил недавно, так что пока не могу оценить эффект.
Использую eyeleo (бесплатная)
Вы правы. В данном случае я бы тоже предпочел обойтись без UpgradeableReadLock.
Не очень понял о чем Вы. Дальше UpgradeableReadLock никто не пройдёт…

Only one thread can enter upgradeable mode at any given time. (Отсюда)
… и будут висеть.

Проблема в том, что не понятно сколько они там будут висеть.
Посмотрите Алгоритмы кэширования. Скорее всего под Вашу задачу что-нибудь подойдёт. LRU или еще чего.
Не надо писать 2 раза

if (data.TryGetValue(key, out wr))
{
    val = (TValue)wr.Target;
    if (val != null)
        return val;
}

Пока вы в UpgradeableReadLock никто ничего не запишет
Я не о тех евентах о которых Вы. О типизированных. У нас же С#.
Например:
public class UserSelected
{
	private readonly int userId;

	public UserSelected(int userId)
	{
		this.userId = userId;
	}

	public int UserId
	{
		get
		{
			return this.userId;
		}
	}
}


Вы видимо не прочитали что из себя представляет паттерн Event Aggregator.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity