Как я могу управлять порядком, в который запущены обработчики событий?

Используя HttpClient, вам не нужно сериализовать свой объект в Json перед отправкой его в Web Api. HttpClient позаботится о сериализации для вас.

Редактировать (убран предыдущий код, который явно не работал)

Вместо отправки Json в PostAsJsonAsync, просто отправьте объект.

driverDayLogModel driverDayLog = new driverDayLogModel
{
    driverId = Convert.ToInt32(txtId.Text),
    dayStartTime = DateTime.Now,
};
using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://127.0.0.1:54314/");
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    // simply put the object as the second parameter instead of a Json string
    var response = client.PostAsJsonAsync("api/driverdaylogs", driverDayLog).Result;
    if (response.IsSuccessStatusCode)
    {
        // Some Stuff
    }
    else
    {
        MessageBox.Show("Error Code" +
        response.StatusCode + " : Message - " + response.ReasonPhrase);
    }
}

В качестве примечания: использование .Result заблокирует ваш код, поэтому рекомендуемый способ - использовать await и async, но это выходит за рамки этого вопроса / ответа.

19
задан Joel Coehoorn 5 November 2008 в 03:28
поделиться

5 ответов

Принятие простой реализации события (использующий + = и - = на поле делегата, которое в свою очередь будет использовать Delegate.Combine/Remove) затем да, обработчики событий назовут в порядке, в котором они подписаны. Гарантия эффективно дана в Delegate.Combine документация:

Возвращаемое значение

А новая многоадресная передача (объединяемый) делегат со списком вызова, который связывает списки вызова и b в том порядке.

Видят мой статья о событиях для некоторых примеров, из которых Delegate.Combine/Remove делают (и на что события похожи под покрытиями).

18
ответ дан 30 November 2019 в 04:25
поделиться

Делают НЕ , полагаются на событие, заказывая . Все отправки события должны быть логически независимыми, как будто они происходили параллельно.

добавление обработчиков событий в других классах и потоках может нарушить Ваше принятое упорядочивание, это - просто не безопасное предположение для создания, и оно идет вразрез с понятием событий как независимые отделенные действия.

я буду идти один шаг вперед и утверждать, что, если необходимо принять порядок на увольнение событий, Вы имеете серьезный недостаток дизайна и/или неправильно используете события.

4
ответ дан 30 November 2019 в 04:25
поделиться

У Вас мог бы быть один обработчик событий, который вызывает другие функции или делегирует в указанном порядке.

2
ответ дан 30 November 2019 в 04:25
поделиться

Я рекомендовал бы "перенести его".

Делают что-то вроде этого...

MyObject.MyEvent += new MyEventHandler(Wrapper);

public void Wrapper()
{
    Method1();
    Method3();
    Method2();
}

Тот способ, которым Вы все еще сцепляете событие, но имеете полный контроль над тем, что называют.

2
ответ дан 30 November 2019 в 04:25
поделиться

Приносим извинения за поздний ответ.


Я столкнулся с ситуацией, когда мне приходится иметь дело с порядком обработки событий.

У меня есть форма, и когда я нажимаю кнопку на форме, объект добавляется в коллекцию где-то в моем коде.

В коллекции есть событие «Добавлено», и к нему подключились два делегата. Один из методов удаляет любой элемент, только что добавленный в коллекцию, а другой показывает сообщение для пользователя.


Если у меня есть какой-то код, показанный здесь, при срабатывании события будет выдано исключение «IndexOutOfRange»:

// this methods hooks two delegates to MyCollection.Added event, but the order results in a "IndexOutOfRange" exception after the event is triggered
HookEvents()
{
   MyCollection.Added += new CollectionItemAddedHandler(DeleteItem_After_CollectionItemAdded);

   MyCollection.Added += new CollectionItemAddedHandler(ShowMessage_After_CollectionItemAdded);
}


// when user click a button on form, add a object to MyCollection
Button_Clicked()
{
   MyCollection.Add(new object());     
}

// at the moment a object is added into the collection, this method remove it
DeleteItem_After_CollectionItemAdded(NewIndexArgs e)
{
    MyCollection.Remove(e.NewIndex); // e.NewIndex represents the newly added item index in current collection  
}

// at the moment a object is added into the collection, this method show its information (hey, but remember, I just remove it in the previous method)
ShowMessage_After_CollectionItemAdded(NewIndexArgs e)
{
    MessageBox.Show(MyCollection[e.NewIndex]); // tell user what is just added into the current collection
    // a "IndexOutOfRange" exception is thrown here....
}

Что заставит этот сценарий работать правильно , так это то, что метод «ShowMessage_After_CollectionItemAdded» должен быть запущен сначала , а затем это будет метод «DeleteItem_After_CollectionAdded».

Хотя мы можем + = сначала метод "ShowMessage ...", иногда мы не можем предопределить эту последовательность до времени выполнения .

0
ответ дан 30 November 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: