Как вызвать хранимую процедуру в фоновом режиме?

У меня есть одна Хранимая процедура, которая занимает около 2-3 минут, чтобы завершить ее выполнение. Из ado.net я хочу, чтобы выполнение этой хранимой процедуры происходило в фоновом режиме. Мне нужно вернуться к моему коду, как только я сделаю запрос хранимой процедуре. Может ли кто-нибудь помочь мне в этом?

Вы должны исследовать Threading . Короче говоря, вы создаете поток с вызовом хранимой процедуры. Когда вы начинаете поток, он запускается в beackground. Этот поток может иметь функцию обратного вызова, которая вызывается, когда поток заканчивается.

BackgroundWorker – это простой способ создания потоков.

Рассмотрите возможность использования рабочего потока для выполнения вызова sproc при фоновом вызове. Вы хотите узнать результат вызова sproc? Если вы это сделаете, вам нужно будет подождать и присоединиться к рабочему потоку, выполняющему ваш вызов sproc. Если нет, вы можете просто «стрелять и забывать» – но вы можете не знать о каких-либо ошибках / исключениях в этом случае.

Вот отличный пост от Джо Альбахари, один из которых был пронизан резьбой.

У вас на самом деле есть два варианта. Как отмечали другие, очень разумным решением является нарезка резьбы на прикладном уровне. Один поток запускает хранимую процедуру и ждет возврата.

Другой – сделать что-то подобное в базе данных. SQL Server, например, предлагает нечто, называемое асинхронными очередями. Вы можете отправить код в запрос, который затем подбирается читателем очереди и запускается в фоновом режиме.

В вашем случае потоки в приложении, вероятно, являются прекрасным решением. Я просто хотел довести идею очереди до вашего сведения, если вы ожидаете, что нагрузка одной хранимой процедуры может стать очень большой, и вы не хотите управлять всеми потоками в своем приложении.

Вы можете попробовать использовать Reactive programming (Rx)

Rx – новое предложение Microsoft для упрощения асинхронных вызовов среди других интересных функций

http://msdn.microsoft.com/en-us/data/gg577609.aspx

Пакет Nuget:

https://nuget.org/packages/Rx-Main/1.0.11226

Это было бы примерно так:

// here call the sp var o = Observable.Start(() => { Thread.Sleep(1000); }); o.Subscribe(x => { Console.WriteLine("Operation done"); });