Правильный способ создания потока в веб-приложении 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?, но это было слишком сложно с несколькими вопросами.
Ответы
Ответ 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);
}