2015-09-14 6 views
0

Я видел несколько вопросов по этой проблеме, но я не нашел подходящего ответа на вопрос. Изначально я использовал следующий код после написания JSON в функцииКак обрабатывать Thread был прерван Исключение vb.net/C#?

  HttpContext.Current.Response.Flush(); 
      HttpContext.Current.Response.SuppressContent = True; 
      HttpContext.Current.ApplicationInstance.CompleteRequest(); 

получал Server cannot append header after HTTP headers have been sent исключение.

Так что я изменил код

try { 
    HttpContext.Current.Response.Write(Data); 
    HttpContext.Current.Response.End(); 
} catch (System.Threading.ThreadAbortException exc) { 
    try { 
     //Sends the response buffer 
     HttpContext.Current.Response.Flush(); 
     // Prevents any other content from being sent to the browser 
     HttpContext.Current.Response.SuppressContent = true; 
     //Directs the thread to finish, bypassing additional processing 
     HttpContext.Current.ApplicationInstance.CompleteRequest(); 
    } catch (Exception ex) { 
       //Log Exception 
    } 

} 

Все эти кода в функции (позволяет говорить) writeData() и его называют функцией называется CallWriteData. Теперь исключение было успешно обработано в функции WriteData(), но его бросание исключение Thread was being aborted в родительской функции CallWriteData.

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

+0

Ну, я собираюсь предположить, что нить, которая прерывается, является потоком http. Если он был прерван в вызове writeData(), почему вы ожидаете, что какие-либо последующие операции в одном потоке будут работать? Если writeData() уже обрабатывает исключение, зачем вы его обрабатываете снова? – iheanyi

+0

u означает, почему я обрабатываю его в 'CallWriteData'? – Binny

+0

Да. Если вы вызываете writeData() из CallWriteData(), чтобы заботиться о записи данных и обрабатывать все связанные исключения, почему вы перестраиваете исключение и обрабатываете его второй раз в CallWriteData()? – iheanyi

ответ

0

Наконец, это помогло мне справиться Thread was being aborted исключение,

try 
{ 
    //Write HTTP output 
    HttpContext.Current.Response.Write(Data); 
} 
catch (Exception exc) {} 
finally { 
    try 
    { 
     //stop processing the script and return the current result 
     HttpContext.Current.Response.End(); 
    } 
    catch (Exception ex) {} 
    finally { 
     //Sends the response buffer 
     HttpContext.Current.Response.Flush(); 
     // Prevents any other content from being sent to the browser 
     HttpContext.Current.Response.SuppressContent = true; 
     //Directs the thread to finish, bypassing additional processing 
     HttpContext.Current.ApplicationInstance.CompleteRequest(); 
     //Suspends the current thread 
     Thread.Sleep(1); 
    } 
    } 

если вы используете следующий код вместо HttpContext.Current.Response.End(), вы получите исключение Server cannot append header after HTTP headers have been sent.

  HttpContext.Current.Response.Flush(); 
      HttpContext.Current.Response.SuppressContent = True; 
      HttpContext.Current.ApplicationInstance.CompleteRequest(); 

Другой Фикс, который я нашел Thread.BeginCriticalRegion();

try 
{ 
    //Write HTTP output 
    HttpContext.Current.Response.Write(Data); 
    } catch (Exception exc) {} 
    finally { 
    try { 
    //Notifies a host that execution is about to enter a region of code in which the effects of a thread abort or unhandled exception might jeopardize other tasks in the application domain. 
    Thread.BeginCriticalRegion(); 
    HttpContext.Current.Response.End(); 
     } catch (Exception ex) {} 
    finally { 
    //Sends the response buffer 
    HttpContext.Current.Response.Flush(); 
    // Prevents any other content from being sent to the browser 
    HttpContext.Current.Response.SuppressContent = true; 
    //Directs the thread to finish, bypassing additional processing 
    HttpContext.Current.ApplicationInstance.CompleteRequest(); 
    Thread.EndCriticalRegion(); 
     } 
    } 

Теперь я с облегчением человек.

-2

Вот как работает IIS. Он запускает новый поток для нового запроса. Поток делает это, и когда он заканчивается, поток прерывается. Как правило, это происходит в сантехнике .NET, и оно работает там. Однако, вы делаете что-то вроде Server.Redirect(), оно также будет прервано - в вашем коде. Аналогично завершению запроса, как и вы. IIS говорит: «Он отправил возвращение, так что убить его». Вот как это работает.

(нить, вероятно, сохраняется для повторного использования другого запроса, но код только что закончил на этом прерывается.)

+1

Не работает IIS ... Обычно потоки не прерываются ... (подумайте о добавлении ссылок, которые докажут вашу точку зрения, желательно MSDN или http://www.asp.net/) –

+0

Раньше я получал как вы сказали, когда я использую 'response .redirect', но если я использую' HttpContext.Current.ApplicationInstance.CompleteRequest(); ', он не бросает никаких исключений.Я использовал электронную почту всякий раз, когда получаю исключения, поэтому его раздражает. поэтому нет другого способа исправить эту проблему или обойти ее? – Binny

+0

Мой собственный код, который перенаправлен, получил ThreadAbortedExceptions. В настоящее время я не делаю много веб-материалов, но он, безусловно, так привык. –