Вы вызываете это из SQL Server?
Почему бы просто не запустить массовое обновление в отдельном потоке и просто быстро вернуть назад, что оно было поставлено в очередь и обрабатывается.
Я сделал это, чтобы не использовать слишком много соединений с базой данных, я просто помещаю данные в очередь и каждые десять секунд обрабатываю все, что находится в очереди.
Тогда ваша вторая функция может проверить статус.
UPDATE:
У меня есть статический класс, который выполняет обработку, и код находится в конце. По сути, поступает вызов, и я сразу же возвращаюсь, чтобы он был успешно помещен в очередь. Очередь просто работает в фоновом режиме, проверяя каждые десять секунд и обрабатывая все, что там есть.
Я использую ConcurrentQueue
для своей очереди, чтобы я мог писать и обрабатывать одновременно.
Итак, вы можете использовать это, чтобы начать обновление, тогда другой вызов может увидеть, сколько было обработано, и вернуть эту информацию обратно.
public string[] UpdateJobs(Jobs[] jobs)
{
WebServiceControllerStatic.JobQueue = jobs;
WebServiceControllerStatic.ProcessUpdateJobQueue();
List<String> s = new List<String>();
for (int t = 0; t < jobs.Length; t++)
{
s.Add("Success");
}
return s.ToArray();
}
Они находятся в классе WebServiceControllerStatic:
public static Jobs[] JobQueue
{
set
{
try
{
value.AsParallel().ForAll(i => jobqueue.Enqueue(i));
}
catch (Exception e)
{
writeToLog("..\r\n" + e.Message + "\r\n" + e.StackTrace);
}
}
}
public static void ProcessUpdateJobQueue()
{
Action UpdateJob = () =>
{
if (jobqueue.IsEmpty)
return;
Parallel.For(0, jobqueue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 1 },
(j) =>
{
// Do updates here
});
};
if (processUpdateJobThread == null)
{
processUpdateJobThread = new System.Threading.Thread(() =>
{
while (true)
{
UpdateJob();
System.Threading.Thread.Sleep(10000);
}
});
processUpdateJobThread.Start();
}
}