2010-01-12 2 views
1

문제 : 나는 ASP.NET 2.0/C# 응용 프로그램에서 일하고 난 다음을 수행해야합니다ASP.NET 스레딩 문제

내가 가진 내가 타사 라이브러리에서 사용하고 함수

를 말할 수
MyFunctions.CalculateTotal(int a, int b); 

알려진 문제는 스레드가 리소스를 잠그는 것입니다. 따라서 모든 것을 정리하기 위해 나중에 호출해야하는 또 다른 기능이 있습니다.

MyFunctions.ThreadExit(); 

문제는 현재 스레드가 종료되어 나중에 다른 기능을 사용할 수 없다는 것입니다. 또한, 내가 asp.net 스레드를 죽이는 것이 적절하지 않은 것 같습니다.

나는 회전을 별도의 스레드로 생각했지만 해킹이 될 수 있습니다.

Global.asax에이 위해 Application_Start/종료 등 그 응용 다양한 이벤트가 나는 아무 이벤트는 Application_ThreadStart/끝으로 존재하지 알고 있지만, 그런 어쩌면 뭔가

?

가능한 해결책에 대한 다른 제안 사항이 있습니까?

+0

그래서 내가 스레드 A에서 CalculateTotal을 호출하면 해당 호출 후에 스레드가 계속 실행되지 않고 다른 스레드에서 ThreadExit를 호출해야한다는 것을 말하고있는 것입니까? – AaronLS

+1

제 3 자 라이브러리가 ... ^^ –

+0

aaronis - 아니요, 스레드 A가 계속 될 것이므로 내 게시물을 수정하여 내부적으로 리소스를 잠그고 모든 것을 정리하는 것이 좋습니다. – hmak

답변

3

이 (업데이트)

해당 라이브러리가 현재의 thread에 혼란을하고 그 자체 뒤처리를 할 경우 스레드를 종료하도록 강요하고 싶어처럼 소리. 이 경우에는 항상 별도의 스레드에서 해당 메서드를 실행합니다. 테스트되지 않은 코드 :

int result; 
var thread = new Thread(_ => { 
    result = MyFunctions.CalculateTotal(a, b); 
    MyFunctions.ThreadExit(); 
}).Start(); 
+0

죄송하지만 대신 내 게시물을 수정했습니다. 알려진 문제점은 스레드가 자원을 잠그는 것입니다. 따라서 모든 것을 정리하기 위해 나중에 호출해야하는 또 다른 기능이 있습니다. – hmak

+0

아 좋아. 나는 아직도이 접근법과 함께 갈 것이라고 생각한다. 당신은 기본적으로 그 제 3 자 라이브러리를 자신의 스레드로 호출합니다. 그렇게하면 끝 부분을 정리할 수있는 자체 실행/스레드 컨텍스트가 있습니다. –

+0

asp.net에서 내가 활용할 수있는 것이 무엇인지 알고 계시므로 매번이 설정을 할 필요가 없습니까? – hmak

2

별도의 스레드를 사용하는 것이 이러한 해킹이 될지 잘 모르겠습니다. 그것이 필요한 것 같습니다.

BTW - 제 3 자 라이브러리가 절대적으로 끔찍한 소리를냅니다! ;-)

0

This article는 그것이 IHttpAsyncHandler을 사용하는 것, 당신이 도움이 될 수 있습니다 - 당신은 "asynchandler.ashx"로 사용합니다. 이미 실현되지 않았다면 know a bit about HttpHandlers이 필요하므로 즉시 해결책은 아닙니다. 당신을 MyFunctions과의 코드

약간 수정 된 버전은 다음과 같습니다

public class AsyncHandler : IHttpAsyncHandler 
{ 
    public void ProcessRequest(HttpContext ctx) 
    { 
    // not used 
    } 

    public bool IsReusable 
    { 
    get { return false;} 
    } 

    public IAsyncResult BeginProcessRequest(HttpContext ctx, 
              AsyncCallback cb, 
              object obj) 
    { 
    AsyncRequestState reqState = 
         new AsyncRequestState(ctx, cb, obj); 
    AsyncRequest ar = new AsyncRequest(reqState); 
    ThreadStart ts = new ThreadStart(ar.ProcessRequest); 
    Thread t = new Thread(ts); 
    t.Start(); 

    return reqState; 
    } 

    public void EndProcessRequest(IAsyncResult ar) 
    { 
    AsyncRequestState ars = ar as AsyncRequestState; 
    if (ars != null) 
    { 
    // here you could perform some cleanup, write something else to the 
    // Response, or whatever else you need to do 
    } 
    } 
} 

public class AsyncRequest 
{ 
    private AsyncRequestState _asyncRequestState; 

    public AsyncRequest(AsyncRequestState ars) 
    { 
    _asyncRequestState = ars; 
    } 

    public void ProcessRequest() 
    { 
    MyFunctions.CalculateTotal(int a, int b); 

    // tell asp.net I am finished processing this request 
    _asyncRequestState.CompleteRequest(); 
    } 
} 
자신의 변수 이름들은 불쾌한 것입니다 변경

.