правильный способ создать поток в веб-приложении ASP.NET - PullRequest
23 голосов
/ 01 декабря 2009

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

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

Спасибо: Матти

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

Ответы [ 2 ]

29 голосов
/ 01 декабря 2009

Примерно так:

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 .

5 голосов
/ 01 декабря 2009

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

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);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...