ASP에 의해 트리거된 비동기 작업 실행.NET 웹페이지 요청
저는 다양한 이유로 ASP에 대한 HTTP 호출을 사용하여 트리거해야 하는 비동기 작업을 가지고 있습니다.NET 웹 페이지.내 페이지가 요청되면 이 작업을 시작하고 즉시 클라이언트에게 승인을 반환해야 합니다.
이 방법은 WCF 웹 서비스를 통해서도 노출되며 완벽하게 작동합니다.
처음 시도했을 때는 예외를 두었고, 다음과 같이 말했습니다.
이 컨텍스트에서는 비동기 작업이 허용되지 않습니다. 비동기 작업을 시작하는 페이지에 비동기가 있어야 합니다.특성을 true로 설정하고 비동기 작업은 다음 작업만 수행할 수 있습니다.PreRenderComplete 이벤트 이전 페이지에서 시작했습니다.
그래서 당연히 제가 추가를.Async="true" 변수를한개수에o수er@Page 비동기 완료될 때까지 됩니다.이제 오류는 발생하지 않지만, 비동기 작업이 완료될 때까지 페이지가 차단됩니다.
어떻게 하면 진정한 화재 및 잊기 페이지를 작동시킬 수 있습니까?
편집: 자세한 정보를 위한 일부 코드입니다.이것보다 좀 더 복잡하지만, 전체적인 아이디어를 거기에 넣으려고 노력했습니다.
public partial class SendMessagePage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string message = Request.QueryString["Message"];
string clientId = Request.QueryString["ClientId"];
AsyncMessageSender sender = new AsyncMessageSender(clientId, message);
sender.Start();
Response.Write("Success");
}
}
AsyncMessageSender 클래스:
public class AsyncMessageSender
{
private BackgroundWorker backgroundWorker;
private string client;
private string msg;
public AsyncMessageSender(string clientId, string message)
{
this.client = clientId;
this.msg = message;
// setup background thread to listen
backgroundThread = new BackgroundWorker();
backgroundThread.WorkerSupportsCancellation = true;
backgroundThread.DoWork += new DoWorkEventHandler(backgroundThread_DoWork);
}
public void Start()
{
backgroundThread.RunWorkerAsync();
}
...
// after that it's pretty predictable
}
웹 양식을 실행하는 경우 요청할 .aspx 페이지에서 Ansync = "true"를 설정합니다.
<%@ Page Language="C#" Async="true" ... %>
사용자에게 반환하는 것에 관심이 없다면 별도의 스레드를 실행하거나 빠르고 더러운 접근을 위해 대리인을 사용하여 비동기식으로 호출할 수 있습니다.비동기화 작업이 완료될 때 사용자에게 알리는 것이 중요하지 않다면 콜백을 무시할 수 있습니다.SomeVeryLongAction() 메서드의 끝에 중단점을 넣으십시오. 그러면 페이지가 이미 제공된 후 실행이 완료됩니다.
private delegate void DoStuff(); //delegate for the action
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//create the delegate
DoStuff myAction = new DoStuff(SomeVeryLongAction);
//invoke it asynchrnously, control passes to next statement
myAction.BeginInvoke(null, null);
Button1.Text = DateTime.Now.ToString();
}
private void SomeVeryLongAction()
{
for (int i = 0; i < 100; i++)
{
//simulation of some VERY long job
System.Threading.Thread.Sleep(100);
}
}
문제는 다음과 같습니다. Async 속성은 페이지가 스레드를 차단하는 장시간 실행 작업을 호출하고, 사용자에게 정보를 반환하기 위해 페이지가 해당 작업의 출력을 필요로 하는 경우입니다.예를 들어, 페이지가 웹 서비스를 호출해야 하는 경우, 응답을 기다린 다음 응답의 데이터를 사용하여 페이지를 렌더링합니다.
Async 특성을 사용하는 이유는 스레드를 차단하지 않기 위해서입니다.이것은 ASP이기 때문에 중요합니다.NET 애플리케이션은 요청을 처리하기 위해 스레드 풀을 사용하며, 사용 가능한 스레드 수는 비교적 적습니다.또한 웹 서비스 호출을 기다리는 동안 각 호출이 스레드를 연결하는 경우 사용자가 웹 서비스 호출이 완료될 때까지 기다려야 할 정도로 많은 동시 사용자가 발생할 수 있습니다.Async 특성을 사용하면 스레드가 웹 서비스 호출이 돌아오기를 기다리는 동안 아무것도 하지 않고 가만히 앉아 있도록 강요하는 대신 스레드 풀로 돌아가 웹 사이트에 대한 다른 동시 방문자를 서비스할 수 있습니다.
결과는 다음과 같습니다. 비동기 특성은 비동기 작업이 완료될 때까지 페이지를 렌더링할 수 없는 경우를 위해 설계되었으며, 이로 인해 페이지를 즉시 렌더링하지 않습니다.
직접 스레드를 실행하고 데몬 스레드로 만들어야 합니다.정확한 구문은 기억나지 않지만 BCL 문서에서 "daemon"을 검색하면 쉽게 찾을 수 있습니다.이것은 스레드가 응용프로그램이 활성화되어 있는 동안 응용프로그램이 종료되는 것을 방지한다는 것을 의미하며, 이는 ASP가 중요하기 때문입니다.NET과 IIS는 필요하다고 판단될 때 "프로세스를 재활용"할 수 있는 권한을 보유하고 있으며, 스레드가 작동하는 동안 이 권한이 발생하면 작업이 중지됩니다.스레드 데몬을 만들면 이를 방지할 수 있습니다(일부 희귀 에지 경우를 제외하고는...).이에 대한 설명서를 찾으시면 자세한 내용을 보실 수 있을 것입니다.
이 데몬 스레드는 이러한 작업을 시작하는 곳입니다.그리고 데몬 스레드에 작업을 수행하도록 지시한 후 즉시 페이지를 렌더링할 수 있습니다. 그러면 페이지 렌더링이 즉시 수행됩니다.
ASP에 있는 데몬 스레드보다 훨씬 낫습니다.그러나 NET 프로세스는 작업을 수행하기 위한 Windows 서비스를 구현하는 것입니다.ASP를 받으십시오.NET 애플리케이션은 수행할 작업을 서비스에 전달합니다.데몬 스레드가 필요 없고 ASP에 대해 걱정할 필요가 없습니다.재활용되고 있는 NET 공정.서비스 부서에 이 작업을 수행하도록 지시하는 방법은 무엇입니까?WCF를 통해, 또는 서비스가 폴링하는 데이터베이스 테이블에 레코드를 삽입하여.아니면 여러 가지 다른 방법도 있습니다.
편집: 여기 또 하나의 아이디어가 있습니다. 이전에도 이와 같은 목적으로 사용한 적이 있습니다.작업에 대한 정보를 MSMQ 큐에 씁니다.해당 대기열에서 다른 프로세스(또는 다른 컴퓨터에서도)를 꺼내고 시간이 많이 걸리는 작업을 수행합니다.대기열에 삽입하는 작업은 가능한 한 빨리 돌아오도록 최적화되어 있으므로 대기열에 입력한 데이터가 유선 등을 통해 전송되는 동안 스레드가 차단되지 않습니다.작업이 실행될 때까지 기다리지 않고 작업을 수행해야 한다는 사실을 가장 빠르게 파악할 수 있는 방법 중 하나입니다.
비동기를 true로 설정하지 않고도 이 제한을 쉽게 해결할 수 있습니다.
public void Start()
{
new Task(() =>
{
backgroundThread.RunWorkerAsync();
}).Start();
}
웹 서비스를 비동기적으로 호출할 때 이 오류가 발생하면 예외 메시지의 지시에 따라 Async='true' 특성을 추가해야 합니까?
페이지 상단 < Page Language='VB' Async= 'true' AutoEventWireup= 'false' CodeFile= 'my new page.aspx.vb' 상속= 'my new page' %>
언급URL : https://stackoverflow.com/questions/672237/running-an-asynchronous-operation-triggered-by-an-asp-net-web-page-request
'programing' 카테고리의 다른 글
| jQuery 또는 페이지의 메모리 사용량을 찾기 위한 javascript (0) | 2023.09.09 |
|---|---|
| 함수와 닫힘의 균등성을 검사하려면 어떻게 해야 합니까? (0) | 2023.09.09 |
| MySQL에서 줄 바꿈 및 캐리지 반환(\r\n) 찾기 (0) | 2023.09.09 |
| 토쿠드 핫 백업 인 마리아DB (0) | 2023.09.09 |
| jQuery "정의되지 않은 속성 'defaultView'를 읽을 수 없습니다" 오류 (0) | 2023.09.09 |