C# ASP.NET线程问题
问题:我正在使用ASP.NET 2.0/C应用程序,需要执行以下操作: 我从第三方库中使用了一个函数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具有应用程序范
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能解决这个问题,那就太令人惊讶了。