C# ASP.NET线程问题

C# ASP.NET线程问题,c#,asp.net,multithreading,global-asax,C#,Asp.net,Multithreading,Global Asax,问题:我正在使用ASP.NET 2.0/C应用程序,需要执行以下操作: 我从第三方库中使用了一个函数 MyFunctions.CalculateTotal(int a, int b); 一个已知的问题是线程锁定资源。因此,还有一个函数需要在之后调用,以清理所有内容 MyFunctions.ThreadExit(); 问题是,这将退出当前线程,之后我将无法使用任何其他函数。此外,我似乎不适合这样杀死asp.net线程 我曾考虑过另纺一条线,但那将是一个难题 Global.asax具有应用程序范

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

我从第三方库中使用了一个函数

MyFunctions.CalculateTotal(int a, int b);
一个已知的问题是线程锁定资源。因此,还有一个函数需要在之后调用,以清理所有内容

MyFunctions.ThreadExit();
问题是,这将退出当前线程,之后我将无法使用任何其他函数。此外,我似乎不适合这样杀死asp.net线程

我曾考虑过另纺一条线,但那将是一个难题

Global.asax具有应用程序范围内的事件,如应用程序启动/结束

我知道没有像Application\u ThreadStart/End这样的事件,但可能是这样的吗


关于可能的解决方案,还有其他建议吗?

我不确定使用单独的线程是否会是一种黑客行为。听起来这是必要的


顺便说一句,那个第三方图书馆听起来太可怕了

我不确定使用一个单独的线程是否会是一种黑客行为。听起来这是必要的

顺便说一句,那个第三方图书馆听起来太可怕了

(更新)

这听起来像是库想要在当前线程中制造混乱,如果您想让它在自身清理后退出线程,那么它会强迫您退出线程。在这种情况下,我总是在单独的线程中运行该方法。未测试代码:

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

这听起来像是库想要在当前线程中制造混乱,如果您想让它在自身清理后退出线程,那么它会强迫您退出线程。在这种情况下,我总是在单独的线程中运行该方法。未测试代码:

int result;
var thread = new Thread(_ => {
  result = MyFunctions.CalculateTotal(a, b);
  MyFunctions.ThreadExit();
}).Start();
可能会对您有所帮助,它涉及到使用一个-然后将其用作“asynchandler.ashx”。如果你还没有,它确实需要你去做,所以这不是一个即时的解决方案

使用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();
  }
}
更改它们的变量名是因为它们很讨厌。

可能会对您有所帮助,它涉及到使用一个-然后将其用作“asynchandler.ashx”。如果你还没有,它确实需要你去做,所以这不是一个即时的解决方案

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

更改它们的变量名是因为它们很讨厌。

所以你是说,如果我从线程A调用CalculateTotal,它在调用之后将不会继续,你必须从另一个线程调用ThreadExit?第三方库很糟糕…^^aaronis-不,线程A将继续,所以也许我应该编辑我的帖子,说它在内部锁定了一个资源,threadexit会清理一切。所以你是说,如果我从线程A调用CalculateTotal,它在调用之后将不会继续,你必须从另一个线程调用threadexit?第三方库糟透了…^^^aaronis-不,线程A将继续,所以也许我应该编辑我的帖子,说它在内部锁定了一个资源,threadexit会清理所有内容。抱歉,我更正了我的帖子。一个已知的问题是线程锁定资源。所以还有一个函数需要在之后调用来清理一切。啊,好的。我想我还是会采用这种方法。基本上,您可以通过自己的线程调用第三方库。这样,您就可以在最后清理它自己的执行/线程上下文。您知道asp.net中有什么我可以利用的东西吗,这样我就不必每次都设置它了?您可以为库创建一个包装器类。最直接的方法是一个静态类,它只在实现上述模式的代理方法中公开MyFunctions中的每个方法。但是,请记住,线程管理非常昂贵,在您的特定使用场景中,这可能并不理想。如果你调用它每秒50X,你可能会考虑(更高级的)生产者/消费者模式来管理线程。OTOH,如果您的加载是“突发性”且不一致的,那么上述模式或线程池可能值得考虑。@wingho:我认为这可能是唯一一个严重损坏的库,需要单独的清理方法。如果ASP.NET对此进行了修复,那将是令人惊讶的。对不起,我更正了我的帖子。一个已知的问题是线程锁定资源。所以还有一个函数需要在之后调用来清理一切。啊,好的。我想我还是会采用这种方法。基本上,您可以通过自己的线程调用第三方库。这样,您就可以在最后清理它自己的执行/线程上下文。您知道asp.net中有什么我可以利用的东西吗,这样我就不必每次都设置它了?您可以为库创建一个包装器类。最直接的方法是一个静态类,它只在实现上述模式的代理方法中公开MyFunctions中的每个方法。但是,请记住,线程管理非常昂贵,在您的特定使用场景中,这可能并不理想。如果你调用它每秒50X,你可能会考虑(更高级的)生产者/消费者模式来管理线程。OTOH,如果您的加载是“突发性”且不一致的,那么上述模式或线程池可能值得考虑。@wingho:我认为这可能是唯一一个严重损坏的库,需要单独的清理方法。如果ASP.NET能解决这个问题,那就太令人惊讶了。