Подтвердить что ты не робот

Правильный способ создания потока в веб-приложении ASP.NET

Я создаю веб-службу asmx и должен создавать поток для создания фонового ввода-вывода для обновления системных данных. Каков правильный путь? Мне не интересно получать какие-либо результаты для создания потока. Я просто хочу, чтобы рабочий поток ASP.NET создавал поток, который загружает его, и в конце делает одно назначение (я думаю, что assign _alldata = newData является атомарным, где оба экземпляра моего собственного большого класса структуры SystemData), так что рабочий поток, который создал новый поток может распространяться мгновенно.

Я прочитал статью http://msdn.microsoft.com/fi-fi/magazine/cc164128%28en-us%29.aspx#S2, в которой предлагается использовать поток, отличный от threadpool. Однако статья касалась другого/более сложного сценария и не очень помогала мне.

Спасибо: Matti

PS. Я также задал этот вопрос в что такое правильный путь для создания потока для ввода IO базы данных в веб-службе asmx?, но это было слишком сложно с несколькими вопросами.

4b9b3361

Ответ 1

Что-то вроде этого:

public delegate void Worker();
private static Thread worker;

public static void Init(Worker work)
{
    worker = new Thread(new ThreadStart(work));
    worker.Start();
}

public static void Work()
{
    // do stuff
}

Затем начните с вызова Init(Work).

Если вы вызываете BeginInvoke() или ThreadPool.QueueUserWorkItem(), он использует поток пула потоков ASP.NET, который может влиять на масштабируемость вашего приложения.

В случае, если это полезно, я подробно расскажу об этих проблемах в своей книге, а также примеры кода, примеры тестов и т.д.: Ультра-быстрый ASP.NET.

Ответ 2

Взгляните на:

http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx?fid=326357&df=90&mpp=25&noise=3&sort=Position&view=Quick

Вы можете сделать что-то вроде:

 public delegate void MethodInvoker();

    private void Foo()
    {
        // sleep for 10 seconds.
        Thread.Sleep(10000);
    }

protected void Button2_Click(object sender, EventArgs e)
{
    // create a delegate of MethodInvoker poiting to
    // our Foo function.
    MethodInvoker simpleDelegate = new MethodInvoker(Foo);

    // Calling Foo Async
   simpleDelegate.BeginInvoke(null, null);

}