2

メソッドを起動して忘れるこのクラスがあります..唯一の問題は、呼び出しているメソッドHttpContextにスローがある場合NullReferenceExceptionです。

私の推測では、回避策 はありますかHttpcontextThreadPool.QueueUserWorkItem(dynamicInvokeShim, new TargetInfo(d, args));NullReferenceException

方法Httpcontext:

public static DataTable GetDataTable(string name)
{
    return (DataTable)HttpContext.Current.Cache[name];
}

メソッドを起動して忘れるメソッド:

using System;
using System.Threading;

namespace XGen.Kuapo.BLL
{
  public class AsyncHelper
  {
      class TargetInfo
      {
          internal TargetInfo(Delegate d, object[] args)
          {
              Target = d;
              Args = args;
          }

          internal readonly Delegate Target;
          internal readonly object[] Args;
      }

      private static WaitCallback dynamicInvokeShim = new WaitCallback(DynamicInvokeShim);

      public static void FireAndForget(Delegate d, params object[] args)
      {
          ThreadPool.QueueUserWorkItem(dynamicInvokeShim, new TargetInfo(d, args));
      }

      static void DynamicInvokeShim(object o)
      {
          try
          {
              TargetInfo ti = (TargetInfo)o;
              ti.Target.DynamicInvoke(ti.Args);
          }
          catch (Exception ex)
          {
              // Only use Trace as is Thread safe
              System.Diagnostics.Trace.WriteLine(ex.ToString());
          }
      }
  }
}
4

2 に答える 2

6

usr が言ったように:HttpContext.Currentはリクエストを実行しているスレッドでのみ利用可能であり、開始したスレッド プール スレッドは同じスレッドではありません。

ただし、ASP.NET キャッシュにアクセスする場合HttpRuntime.Cacheは、各スレッドから利用できる静的プロパティである も使用できます。(HttpContext.Current.Cache単に戻るHttpRuntime.Cacheので、違いを気にする必要はありません。)

受け取った HttpContext インスタンスHttpContext.Currentを別のスレッドに渡すことはお勧めできないことに注意してください。他のスレッドが実行されるまでに、キャプチャされた HttpContext に対応するリクエストはすでに終了している可能性があるため、壊れた HttpContext インスタンスで終わる可能性があります。

于 2012-05-25T21:30:08.133 に答える
1

はい、HttpContext.CurrentHTTP 要求を実行するスレッドでのみ使用できます。簡単な修正は、式の結果を(DataTable)HttpContext.Current.Cache[name]スレッドに渡すことです。これにより、スレッド自体がHttpContext. HttpContext.Currentまたは、オブジェクトをスレッドに渡します。

スレッドまたはタスクにデータを渡す方法は、この質問の範囲外ですが、ウェブ上で多くの情報を見つけることができます。

于 2012-05-25T20:04:49.177 に答える