问题:我正在开发ASP.NET 2.0 / C#应用程序,我需要执行以下操作:
我在第三方库中使用的功能可以说
MyFunctions.CalculateTotal(int a, int b);
一个已知问题是线程锁定资源。因此,之后还需要调用另一个函数来清理所有内容。
MyFunctions.ThreadExit();
问题是这将退出当前线程,之后我将无法使用任何其他功能。此外,我似乎不适合杀死像这样的asp.net线程。
我考虑过单独创建一个线程,但那将是一个黑客攻击。
Global.asax有像Application_Start / End
这样的应用程序范围的事件我知道没有像Application_ThreadStart / End这样的事件,但也许是这样的事情?
对可能的解决方案有任何其他建议吗?
答案 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();
}
}
更改他们的变量名称是否令人讨厌。