ASP.NET线程问题

时间:2010-01-12 19:09:58

标签: c# asp.net multithreading global-asax

问题:我正在开发ASP.NET 2.0 / C#应用程序,我需要执行以下操作:

我在第三方库中使用的功能可以说

MyFunctions.CalculateTotal(int a, int b);

一个已知问题是线程锁定资源。因此,之后还需要调用另一个函数来清理所有内容。

MyFunctions.ThreadExit();

问题是这将退出当前线程,之后我将无法使用任何其他功能。此外,我似乎不适合杀死像这样的asp.net线程。

我考虑过单独创建一个线程,但那将是一个黑客攻击。

Global.asax有像Application_Start / End

这样的应用程序范围的事件

我知道没有像Application_ThreadStart / End这样的事件,但也许是这样的事情?

对可能的解决方案有任何其他建议吗?

3 个答案:

答案 0 :(得分:3)

(更新)

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

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

答案 1 :(得分:2)

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

BTW - 第三方图书馆听起来非常糟糕! ; - )

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

更改他们的变量名称是否令人讨厌。