HttpContext에 접근합니다.서로 다른 스레드의 전류
저는 C# ASP가 있습니다.SiteCrawler.cs 이라는 클래스에서 일부 메서드를 실행하는 약 25개의 다른 스레드를 시작하는 NET 응용 프로그램입니다.
인HttpContext.Current.Session
사용자가 검색한 결과를 저장하고 스레드가 모두 실행되면 사용자에게 제시하고 싶습니다.내 문제는.HttpContext.Current
개체가 존재하지 않으므로 생성된 스레드에서 null입니다.
응용프로그램이 다중 스레드일 때 제한이 있기 때문에 세션을 사용하지 않고 사용자/세션별 데이터를 저장하려면 어떤 다른 옵션이 있습니까?
해결책을 찾기 위해 스택 오버플로우의 모든 부분을 검색해 보았지만 아무런 운이 없었습니다.
저의 어플리케이션에는 많은 코드가 있습니다.HttpContext.Current
그 코드는 수정할 수 없습니다.
worker.DoWork()
아래 샘플에서 그 코드를 사용합니다.그리고 저는 그것을 각각의 스레드에서 실행해야만 했습니다.
저는 다음과 같은 해결책을 찾았습니다.
HttpContext ctx = HttpContext.Current;
Thread t = new Thread(new ThreadStart(() =>
{
HttpContext.Current = ctx;
worker.DoWork();
}));
t.Start();
// [... do other job ...]
t.Join();
Fritz Onion: Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code의 기사를 보십시오.꽤 길지만, 요구 사항이 너무 사소하지는 않습니다.
또한 K. Scott Allen은 바로 이 문제에 대해 다소 짧은 글을 올렸습니다.HttpContext 작업.현재
@로리는 위에 언급을 했습니다. 특정 물체는HttpContext
스레드에 전달해도 null이 됩니다.이 일이 저한테 일어난거에요.User
소유물.대신 다음과 같이 User를 CurrentPrincipal 스레드에 복사할 수 있습니다.
컨트롤러 컨텍스트에서 사용자를 저장합니다.
_user = HttpContext.Current.User;
var processThread = new Thread(() => ThreadedCode());
processThread.Start();
스레드에서 '스레드' 사용자를 설정합니다.
private static void ThreadedCode()
{
// Workaround for HttpContext.Current.User being null.
// Needed for CreatedBy and RevisedBy.
Thread.CurrentPrincipal = _user;
HttpContext는 요청 기간 동안에만 사용할 수 있습니다.스레드는 요청보다 잠재적으로 훨씬 더 오래 지속될 수 있으므로 아마도 처음부터 스레드가 필요한 이유일 것입니다!:)
HttpContext를 추가하기만 하면 됩니다.클래스 SiteCrawler.cs 의 생성자에 대한 최신 정보
public class SiteCrawler
{
HttpContext context = HttpContext.Current;
public void Method()
{
context.WhateverYouWant
}
}
데이터베이스에 저장한 다음 사용자의 브라우저가 계속 새로 고침을 하도록 하거나 ajax를 사용하거나 새로운 signalr을 사용하여 결과가 이미 db에 작성되어 있는지 확인할 수 있습니다.도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/8925227/access-httpcontext-current-from-different-threads
'programing' 카테고리의 다른 글
상대 배치에서 단추의 중심을 잡을 수 있습니까? (0) | 2023.10.14 |
---|---|
맥 OS X 10.7 (Lion)에서 나노 구문 강조? (0) | 2023.10.14 |
구조에서 ->와 .의 차이? (0) | 2023.10.09 |
How to get date range using moment.js (0) | 2023.10.09 |
sequelize.js - 수동으로 mysql 패키지를 설치해야 합니다. (0) | 2023.10.09 |