Asynchrony и события.NET?

Из Ваших предыдущих комментариев Вы сказали - файл журнала присутствовал.

Это могло означать, что Вы открылись и (ЭКСКЛЮЗИВНЫЙ?) транзакция и еще не фиксировали данные. Ваша программа или некоторый другой процесс уезжают - журналируют позади??

Перезапуск процесса sqlite посмотрит на файл журнала и очистит любые незафиксированные действия и удалит - файл журнала.

5
задан Avi 26 October 2009 в 10:07
поделиться

3 ответа

Позвольте мне пролить свет на вашу проблему. Магия - это цикл сообщений Windows. Вы видите в своем примере, что на самом деле нет ничего, что заставляет код A останавливаться, когда происходит событие. Скорее, это последовательность.

Когда выполняется код A, пользователь нажимает кнопку. Сообщение окна кнопки помещается в очередь, но ничего не происходит. Когда код A выходит из своей функции или возвращает управление циклу сообщений, тогда обрабатывается событие Click и запускается обработчик событий.

Попробуйте этот эксперимент. Поместите бесконечный цикл внутри вашей программы в основной поток, а затем щелкните пользовательский интерфейс. Вы заметите, что пользовательский интерфейс не отвечает и обработчики событий не работают.

3
ответ дан 14 December 2019 в 13:40
поделиться

То, что вы увидите с расстояния 20 000 футов, это ] MessageLoop . Он находится внутри Application.Run () .

Проще говоря, это цикл while, который выполняет все время жизни вашего приложения и выполняет

  // pseudo code, I did not reflector Application.Run
  while (GetMessage(ref msg)
  {
     DispatchMessage(ref msg);
  }

. Вы заметите simgle-thread, когда возьмете слишком долго обрабатывает 1 событие, ваше приложение будет помечено как "не отвечающее" в TaskManager.

Связанный метод - Application.DoEvents () , но держитесь подальше от этого.

2
ответ дан 14 December 2019 в 13:40
поделиться

События являются указателями на функции ( точно так же, как раньше в C ++). Когда вы используете обычное ванильное событие .NET, вы фактически вызываете функции, которые связаны с этим событием с помощью + =. Итак, с высоты 20 000 футов ваш код фактически вызывает какой-то другой код точно так же, как вызов другой функции. Вот почему он вызывается синхронно и в одном потоке.

Находясь внутри элемента управления WinForms / WPF, мы также должны учитывать цикл сообщений: Все события, происходящие в контексте формы, добавляют сообщение в цикл сообщений вместо прямого вызова метода.

Основной поток управляющего элемента опрашивает этот цикл на предмет новых сообщений, и когда появляется новое сообщение, он выполняет его (опять же в основном потоке) только теперь это не совсем синхронно.

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

1
ответ дан 14 December 2019 в 13:40
поделиться
Другие вопросы по тегам:

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