Команды Asp.net все еще работают? но почему? - PullRequest
1 голос
/ 02 января 2012

У меня есть такой сценарий:

enter image description here

Когда загружается a.aspx - я нажимаю кнопку1.

вот вопрос:

После нажатия кнопки 1 - I Закрыть браузер.

что теперь происходит с long work сейчас?

Полагаю, это продолжается ...

Но вопрос в том, почему?

Разве Долго не знает, что его основной поток предка был прерван?

на самом деле и его папина нить тоже была прервана (нить b.aspx)

нет каких-либо отношений между long func и b.aspx / a.aspx?

Ответы [ 4 ]

2 голосов
/ 02 января 2012

Когда вы открываете WebRequest для доступа к b.aspx, вы фактически делаете HTTP GET для этой страницы.B.aspx ничего не знает о потоках a.aspx.Однако, когда вы закрываете браузер, канал HTTP от вашего браузера до веб-сервера (с запущенным обработчиком нажатия кнопки) прекращается.Однако веб-сервер не сразу замечает это, и поток, отвечающий на ваше событие click, продолжает ждать завершения веб-запроса b.aspx и, в конечном итоге, ожидает отрисовки вашего долго выполняющегося b.aspx, пока не истечет время ожидания сервера.

2 голосов
/ 02 января 2012

Сервер останавливается только после завершения функции button1_Click, даже если вы закрываете.Поток не прервался при закрытии браузера, сервер только знает, что вы сделали запрос на запуск функции button1_Нажмите, что он не знает, запущен ли браузер или нет.

1 голос
/ 02 января 2012

Когда вы закрываете браузер или переходите на новую страницу, TCP-соединение закрывается, но само по себе это не приводит к прекращению связанного потока.

Перед тем, как начать длительное действие, вы можете посмотреть, все ли еще работает TCP-соединение, установив this.Response.IsClientConnected. Вы также можете разбить длительное действие на несколько более мелких кусков и установить между ними IsClientConnected.

1 голос
/ 02 января 2012

Насколько мне известно, между нажатием кнопки и страницей b.aspx нет никаких подразумеваемых связей. Для отмены длинного потока вам понадобится какой-то идентификатор, который будет немедленно возвращен вашему методу клика. Вам также необходимо обнаружить закрытие браузера (не во всех браузерах последний раз, когда я пытался сделать это около 5 лет назад). Затем вам нужно будет как-то отменить этот «запрос», используя ранее возвращенный идентификатор.

Мне кажется, что b.aspx действительно должен быть веб-сервисом, но вам все равно придется выяснить, как отменить запрос "in-progess".

Нет никакого запеченного способа сделать это. Это звучит как интересный «день разработчиков»:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...