0

スレッドがバックグラウンド作業を実行するアクションから新しいスレッドを開始するシナリオがあります。スレッドが作業を完了するのに時間がかかると、セッションが期限切れになったように見えることがあります。新しいスレッドからセッションを維持する方法はありますか?

4

2 に答える 2

3

バックグラウンド スレッドで Session などの HttpContext リソースにアクセスすることは避ける必要があります。このスレッドが必要とする情報をパラメーターとして渡すことができます。

例えば:

public ActionResult Index()
{
    // Get the value you will need from the session
    SomeModel model = (SomeModel)Session["myModel"];

    // start a new Thread
    Thread thread = new Thread(DoWork);
    thread.Start(model);

    return View();
}

private void DoWork(object state)
{
    SomeModel model = (SomeModel)state;
    // do the work here without ever accessing the HttpContext
}

また、セッション、モデル、Cookie など、複数のソースからの情報が必要な場合は、それらすべてを集約する新しいモデルを構築するだけです。

public class MyModel
{
    public SomeModelFromSession SessionData { get; set; }
    public SomeModelFromCookie CookieData { get; set; }
    ...
}

次に、この新しいモデルを開始時にバックグラウンド スレッドに渡します。

于 2013-01-23T07:03:16.803 に答える
0

ファイルをローカル ファイル システムにコピーするときは、セッション/必要なデータを同じファイル名の json ファイルにシリアル化します (またはその情報をデータベースに書き込みます)。

私の提案は次のとおりです。

  • これは、別の Windows サービスまたはバックグラウンドで実行中の実行可能ファイルによって処理される必要があります。
  • Web アプリケーションでこれを処理する場合は、Web アプリケーションの開始時にスレッドを作成し、S3 にアップロードするためにアップロードされた新しいファイルを確認できます。ただし、これの欠点は、IIS が Web アプリケーションをいつリサイクルするかを知ることができず、シナリオによっては、同じ Web アプリケーションの複数のインスタンスを持つことができます (アプリケーション プールの構成によって異なります)。したがって、アプリケーションの再起動を処理し、複数のインスタンスを適切に処理する必要があります。
  • または、キュー システム (MSMQ、データベースなど) を使用することもできます。
  • Redis またはデータベースを使用することもできます。
于 2013-01-23T19:14:38.987 に答える