Връзка към базата с нишки в ASP.NET Web Api

+6 гласа
151 прегледа
попитан 2016 май 19 от Nikoleta.V. (4,090 точки)

Имам проблем с използването на Database в нишка в ASP.NET приложение. Искам когато пусна приложението да се започва нишка наречена „BackgroundWorker“, която върви на заден план докато не се спре приложението. 

Обаче имам проблем с dbContext в тази нишка. 

Опитвам да пусна worker-а в  Startup.cs в методите "ConfigureServices" или "Configure" и след това да инициализирам dbContext-а в конструктура на worker-а (dbContext = new ApplicationContext()). Казва ми че връзката не е конфигурирана когато опитам да работя с while(true) опашката на базата. Ако си напиша мой контролер за worker-а, който получава ApplicationContext в конструктура, и след това пуска нишката, като извикам контролера с GET заявка:  

public BackgroundWorker(ChronicusContext dbContext) 

    { 

        _dbContext = dbContext; 

        _messageService = new MailMessageService(); 

    } 

    // GET: api/backgroundworker 

    [HttpGet] 

    [Route("start")] 

    public void StartWorker() 

    { 

        //Thread thread = new Thread(this.DoBackGroundWork); 

        Thread thread = new Thread(() => DoBackGroundWork(this._dbContext)); 

        thread.Start(); 

    } 

  public void DoBackGroundWork(ChronicusContext _dbContext) 

    { 

        while (true) 

            { 

                if (_dbContext.PollModels.Any())  //Here is the exception 

                { 

                 ... 

                } 

            } 

        } 

Получавам System.ObjectDisposedException, което значи че обектът вече е освободен в  while (true) опашката. 

Опитах по различни начини, но винаги получавам изключение като това или че връзката с базата е затворена. 

Ще съм благодарен ако ми помогнете! 

1 отговор

0 гласа
отговорени 2016 май 20 от valeri.hristov (7,340 точки)
избран 2016 май 26 от Mitko Vasilev
 
Най-добър отговор
В общия случай, многонишковата работа от стана на сървъра в уеб приложения не се прави често и в повечето случаи няма смисъл.

По концепция сървъра работи многонишково. Обрабова много HTTP заявки. За мобилна и уеб архитектура сървъра обработва множество заявки и клиентите обработват асинхронни извиквания и изчакват отговор от дълги извиквания като твоя API метод StartWorker.

В този случай, клиентът като направи запитване изчаква за отговор, няма смисъл да слагаш метода в нова нишка.

Давам ти пример. Клиентът ти е уеб страница с Ajax. Извикваш StartWorker чрез Ajax, зареждаш данните в html таблица. Когато StartWorker отговори, Ajax зарежда html таблицата с данните. StartWorker трябва да отговори с данните. Ако отговори предварително ще трябва да изпращаш известие, например чрез SignalR, когато другата нишка завърши и има данните за html таблицата.

Надявам се разбираш, че извикването на WebAPI метода отнема същото време като Ajax заявката, така че да го правиш многонишково е излишно.

Може да зареждаш другите UI елементи или да показваш progress spinner докато зареждат данните, за да знаят потребителите, че все още се зарежда нещо.

Ако все пак се наложи да ползваш отделни нишки в проекта, смятам че трябва да използваш Entity Framework 6 или нагоре, за да се поддържат асинхронните заявки. Това ще ти е полезно:

http://www.codeproject.com/Tips/805923/Asynchronous-programming-in-Web-API-ASP-NET-MVC
...