C# 线程池中的DLL绑定从http请求启动
我有一个线程池工作项任务,当ASP.net用户调用我的web应用程序中的特定服务时,该任务将启动。部署环境通过web.config文件中的绑定重定向来访问旧版本的Oracle.DataAccess DLL,该重定向对于同步http通信非常有效。但是,线程池任务是异步的,线程池代码会忽略DLL重定向,并搜索构建它所依据的较新Oracle DLL 我已尝试将app.config、[ProjectDLLName].config和[ProjectDLLName].exe.config放在部署它的bin文件夹中,但它们似乎被忽略了。有没有办法在代码中指定DLL依赖项?或者线程池代码是否应该使用不同的命名约定来自动拾取单独文件中的运行时标记 编辑:下面是http请求如何启动线程工作项C# 线程池中的DLL绑定从http请求启动,c#,asp.net,multithreading,oracle,dll,C#,Asp.net,Multithreading,Oracle,Dll,我有一个线程池工作项任务,当ASP.net用户调用我的web应用程序中的特定服务时,该任务将启动。部署环境通过web.config文件中的绑定重定向来访问旧版本的Oracle.DataAccess DLL,该重定向对于同步http通信非常有效。但是,线程池任务是异步的,线程池代码会忽略DLL重定向,并搜索构建它所依据的较新Oracle DLL 我已尝试将app.config、[ProjectDLLName].config和[ProjectDLLName].exe.config放在部署它的bin文
public class AsynchBuildMugHandler : IHttpAsyncHandler, IReadOnlySessionState
{
public bool IsReusable { get { return false; } }
...
public AsynchBuildMugHandler()
{
}
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
{
...
AsynchBuildMugOperation asynch = new AsynchBuildMugOperation(cb, context, extraData);
asynch.StartAsyncWork();
return asynch;
}
public void EndProcessRequest(IAsyncResult result)
{
ScenarioCRUD scenDao = new ScenarioCRUD(null);
if (buildScen != null)
{
scenDao.SetJobStatus(buildScen,"IDLE"); // whether cancel/crash/success always set back to idle
}
}
public void ProcessRequest(HttpContext context)
{
throw new InvalidOperationException();
}
}
class AsynchBuildMugOperation : IAsyncResult
{
private bool _completed;
private Object _state;
private AsyncCallback _callback;
private HttpContext _context;
bool IAsyncResult.IsCompleted { get { return _completed; } }
WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } }
Object IAsyncResult.AsyncState { get { return _state; } }
bool IAsyncResult.CompletedSynchronously { get { return false; } }
public AsynchBuildMugOperation(AsyncCallback callback, HttpContext context, Object state)
{
_callback = callback;
_context = context;
_state = state;
_completed = false;
}
public void StartAsyncWork()
{
...
if (validSession)
{
if (validScen)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null);
_context.Response.Redirect(...ScenarioJobMonitor.aspx");
}
else
{
_context.Response.Redirect(...BuildStartFail.aspx"); // Shortcut to having to pass info around
}
}
else
{
_context.Response.Redirect(...login.aspx");
}
}
private void StartAsyncTask(Object workItemState)
{
// do a bunch of stuff that invokes Oracle DLL (works synchronously in other parts of the WebApp.
// doesn't work here
_completed = true;
_callback(this);
}
}
}
演示如何启动线程池项。我很好奇你是否用正确的方式来做,如果你做得不正确,你可能会在你的后台工作完成之前关闭你的AppDomain。我们还需要了解您是如何调用代码的,最好是同步调用和异步调用。@ScottChamberlain编辑了问题主体,以显示线程启动。Webapp中其他地方的非线程池代码工作正常(遵守web.config中的重定向)。在DLL版本与IDE相同的开发服务器上也可以正常工作。在ASP.NET中工作时,您可能希望查看它,而不是
ThreadPool.QueueUserWorkItem
。但是,它只是.NET4.5.2和更新版本的功能。(顺便说一句,这对您的实际问题没有帮助,但我想您可能想知道)我想知道这是否是我想要的,以便强制工作项与web应用程序代码的其余部分在同一线程池中启动(并且受同一web.config属性的约束)@ScottChamberlain我认为这是我基于原型(或其他地方的转载)的原始文章。与同步代码库的其余部分相比,这里没有提到行为。这可能是一个bug,或者是一个过时的框架,有更好的方法吗?我尝试了其他app.manifest和项目配置更改,但在前面的评论中链接的delegate.BeginInvoke是我唯一没有深入尝试的。