C# 如何在asyn轮询函数中将httpcontext传递给子线程
我也经历过类似的关于httpContext.Current在异步方法中变为null的查询 根据本文->,HttpContext在异步函数(子线程)中不可用 我已经在我的函数中实现了异步轮询,我调用的函数使用httpContext对象,该对象为null。有人能告诉我如何将HttpContext传递给子线程吗C# 如何在asyn轮询函数中将httpcontext传递给子线程,c#,asp.net,multithreading,asynchronous,C#,Asp.net,Multithreading,Asynchronous,我也经历过类似的关于httpContext.Current在异步方法中变为null的查询 根据本文->,HttpContext在异步函数(子线程)中不可用 我已经在我的函数中实现了异步轮询,我调用的函数使用httpContext对象,该对象为null。有人能告诉我如何将HttpContext传递给子线程吗 delegate DataSet MethodDelegate(SqlParameter[] paramFilterScreenCreate); public DataSet Call()
delegate DataSet MethodDelegate(SqlParameter[] paramFilterScreenCreate);
public DataSet Call()
{
dtFilter= ExecutePolling(paramFilterScreenCreate);
}
public DataSet LongRunningMethod( SqlParameter[] paramFilterScreenCreate)
{
DataSet dtFilter = new DataSet();
//call a stored procedure and connection string(Session Manager class - session.cs)
dtFilter = SqlHelper.ExecuteDataset(Utility.GetConnectionString(Constants.ASSET_MANAGEMENT), StoreProcedures.ROD_SCREEN_FILTER_EXECUTE, paramFilterScreenCreate);
return dtFilter;
}
public DataSet ExecutePolling(SqlParameter[] paramFilterScreenCreate)
{
MethodDelegate dlgt = LongRunningMethod;
// Initiate the asynchronous call.
IAsyncResult ar = dlgt.BeginInvoke(paramFilterScreenCreate, null, null);
// Poll IAsyncResult.IsCompleted
while (ar.IsCompleted == false)
{
Thread.Sleep(1000);
}
DataSet result = dlgt.EndInvoke(ar);
return result;
}
Class Session
{
/// <returns>Returns of the value of the sessoin for the specified key</returns>
public static T Get<T>(string key)
{
object objectToReturn = null;
objectToReturn = HttpContext.Current.Session[key] ;//HttpContext goes null here
return objectToReturn == null ? default(T) : (T)objectToReturn;
}
}
委托数据集方法委托(SqlParameter[]paramFilterScreenCreate);
公共数据集调用()
{
dtFilter=执行填充(paramFilterScreenCreate);
}
公共数据集LongRunningMethod(SqlParameter[]paramFilterScreenCreate)
{
数据集dtFilter=新数据集();
//调用存储过程和连接字符串(会话管理器类-Session.cs)
dtFilter=SqlHelper.ExecuteDataset(Utility.GetConnectionString(Constants.ASSET\u MANAGEMENT)、StoreProcedures.ROD\u SCREEN\u FILTER\u EXECUTE、paramFilterScreenCreate);
返回dtFilter;
}
公共数据集执行填充(SqlParameter[]paramFilterScreenCreate)
{
MethodDelegate dlgt=LongRunningMethod;
//启动异步调用。
IAsyncResult ar=dlgt.BeginInvoke(paramFilterScreenCreate,null,null);
//轮询IAsyncResult.IsCompleted
while(ar.IsCompleted==false)
{
睡眠(1000);
}
数据集结果=dlgt.EndInvoke(ar);
返回结果;
}
课堂
{
///返回指定键的sessoin值
公共静态T Get(字符串键)
{
object objectToReturn=null;
objectToReturn=HttpContext.Current.Session[key];//HttpContext在这里为空
return objectToReturn==null?默认值(T):(T)objectToReturn;
}
}
while(ar.IsCompleted==false)
可以切换到while(ar.IsCompleted)
为什么要在while
循环中等待结果EndInvoke
将为您解决此问题。感谢VMAtm,我尝试了您的解决方案,但将其更改为while(ar.IsComplete)并不能解决HttpContext问题。我的LongRunningMethod正在异步子线程上运行,该子线程需要HttpContext对象(会话类代码),该对象将变为null。您需要为调用
的签名添加此参数,并通过参数传递会话
。因为您需要为会话提供代码的引用。