2010-01-12 103 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 2010-01-12 19:16:52

+1

那个第三方库很糟糕...... ^^ – 2010-01-12 19:17:52

+0

aaronis - 不,线程A会继续,所以也许我应该编辑我的帖子,说它内部锁定一个资源,然后threadexit清理所有东西。 – hmak 2010-01-12 19:26:13

回答

3

(更新)

这听起来像该库希望让当前线程很乱,强迫你,如果你想让它清理后本身退出线程。在这种情况下,我总是在一个单独的线程中运行该方法。未经测试的代码:

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

对不起,我改正了我的帖子,而不是说。一个已知的问题是线程锁定资源。所以还有一个功能需要在之后调用来清理所有的东西。 – hmak 2010-01-12 19:29:17

+0

啊好的。我想我仍然会采用这种方法。你基本上是在自己的线程上调用第三方库。这样你就拥有了它自己的执行/线程上下文,它可以在最后清理。 – 2010-01-12 19:32:36

+0

你知道asp.net中的任何东西,我可以利用它,所以我不必每次都安装它了吗? – hmak 2010-01-12 19:50:56

2

我不确定使用单独的线程会是这样的黑客攻击。听起来这是需要的。

顺便说一句 - 那第三方库听起来非常可怕! ;-)

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(); 
    } 
} 

改变他们的变量名是他们讨厌。