C# 如何在asyn轮询函数中将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()

我也经历过类似的关于httpContext.Current在异步方法中变为null的查询

根据本文->,HttpContext在异步函数(子线程)中不可用

我已经在我的函数中实现了异步轮询,我调用的函数使用httpContext对象,该对象为null。有人能告诉我如何将HttpContext传递给子线程吗

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。您需要为
调用
的签名添加此参数,并通过参数传递
会话
。因为您需要为会话提供代码的引用。