ASP.NET Threading Issue - PullRequest
       7

ASP.NET Threading Issue

1 голос
/ 12 января 2010

Проблема: я работаю над приложением ASP.NET 2.0 / C #, и мне нужно сделать следующее:

У меня есть функция, которую я использую из сторонней библиотеки, скажем,

MyFunctions.CalculateTotal(int a, int b);

Известной проблемой является то, что поток блокирует ресурсы. Так что есть еще одна функция, которую нужно вызывать потом, чтобы все очистить.

MyFunctions.ThreadExit();

Проблема в том, что это выйдет из текущего потока, и я не смогу впоследствии использовать любую другую функцию. Кроме того, мне кажется неуместным убивать поток asp.net следующим образом.

Я подумал о том, чтобы крутить отдельную нить, но это было бы хаком.

Global.asax имеет такие события всего приложения, как Application_Start / End

Я знаю, что нет такого события, как Application_ThreadStart / End, но может быть что-то подобное?

Есть еще какие-нибудь предложения для возможного решения?

Ответы [ 3 ]

3 голосов
/ 12 января 2010

(обновлено)

Похоже, что библиотека хочет создать беспорядок в текущем потоке и заставить вас выйти из потока, если вы хотите, чтобы он очистился после себя. В этом случае я всегда запускаю этот метод в отдельном потоке. Непроверенный код:

int result;
var thread = new Thread(_ => {
  result = MyFunctions.CalculateTotal(a, b);
  MyFunctions.ThreadExit();
}).Start();
2 голосов
/ 12 января 2010

Я не уверен, что использование отдельного потока было бы таким взломом. Похоже, это то, что требуется.

Кстати - эта сторонняя библиотека звучит абсолютно ужасно! ; -)

0 голосов
/ 13 января 2010

Эта статья может помочь вам, она включает в себя использование IHttpAsyncHandler - вы можете использовать это как "asynchandler.ashx" Это действительно требует, чтобы вы знали немного о HttpHandlers , если вы этого еще не сделали, так что это не мгновенное решение.

Слегка измененная версия их кода с вашими MyFunctions:

public class AsyncHandler : IHttpAsyncHandler
{ 
  public void ProcessRequest(HttpContext ctx)
  {
    // not used
  }

  public bool IsReusable
  {
    get { return false;}
  }

  public IAsyncResult BeginProcessRequest(HttpContext ctx, 
                                          AsyncCallback cb, 
                                          object obj)
  {
    AsyncRequestState reqState = 
                      new AsyncRequestState(ctx, cb, obj);
    AsyncRequest ar = new AsyncRequest(reqState);
    ThreadStart ts = new ThreadStart(ar.ProcessRequest);
    Thread t = new Thread(ts);
    t.Start();

    return reqState;
  }

  public void EndProcessRequest(IAsyncResult ar)
  {
    AsyncRequestState ars = ar as AsyncRequestState;
    if (ars != null)
    {
     // here you could perform some cleanup, write something else to the
     // Response, or whatever else you need to do
    }
  }
}

public class AsyncRequest
{
  private AsyncRequestState _asyncRequestState;

  public AsyncRequest(AsyncRequestState ars)
  {
    _asyncRequestState = ars;
  }

  public void ProcessRequest()
  {
    MyFunctions.CalculateTotal(int a, int b);

    // tell asp.net I am finished processing this request
    _asyncRequestState.CompleteRequest();
  }
}

Измените их имена переменных, если они противны.

...