У нас есть контроллер веб-API в C #, из которого я создаю фоновый поток для вызова метода длительного выполнения в DLL.
Существует класс-оболочка для этой DLL, который получает делегата в качестве параметра, который в конечном итоге вызывается из библиотеки DLL для обновления очереди сообщений (MSMQ) сообщениями об обновлении статуса.
[HttpPut]
public HttpResponseMessage DoSomeLongRunningWork([FromBody]MyRequest myReq)
{
//Start thread to do some work
ThreadStart myThreadStart = delegate { DoSomeWork(myReq); };
Thread thread = new Thread(myThreadStart);
thread.IsBackground = true;
thread.Start();
}
private void DoSomeWork(MyRequest req)
{
//Make component call with setting and callback function
ComponentInterface.DoWork(req,UpdateQueue);
}
public void UpdateQueue(string sQueueId, IProgressResponse response)
{
String sProgressMsg = JsonConvert.SerializeObject(response);
// Writes the response to the queue with the unique Id
MSMQEnqueue(sQueueId, sProgressMsg);
}
// Retrieves or Creates private queues with the key and sends a message to it
public static void MSMQEnqueue(string sKey, string sMessage)
{
MessageQueue queue = GetOrCreateQueue(sKey);
try
{
Message message = new Message();
message.Body = sMessage;
queue.Purge();
queue.Send(message);
}
finally {
queue.Close();
queue.Dispose();
}
}
делегат, который передается оболочке и отвечает за обновление очереди сообщений, выглядит следующим образом:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void UpdateProgressDelegate(string sQueueId, IProgressResponse response);
У меня есть еще одна конечная точка для чтения сообщений из очереди сообщений и отображения индикатора выполнения с последним прогрессом. Это работает по большей части, но иногда я получаю это исключение:
First-chance exception at 0x000007fef2096a15 in w3wp.exe: 0xC0000005: Access violation reading location 0x0000000000000000.
Это совершенно спорадично и не ломается в одном месте. иногда он ломается при 25% прогресса, иногда 89%.
Я не могу точно сказать, что не так, потому что визуальный отладчик студии не ломается, где происходит исключение.
Любая помощь с благодарностью.
Обновить
Оказывается, проблема связана с тем, сколько раз вызывается обратный вызов из библиотеки DLL для записи в MSMQ. не уверен, что такое горлышко бутылки / ограничение. Так как каждое сообщение очищает и удаляет любое сообщение, которое есть в очереди, перед записью в него.
Задача ещё не решена.
Других решений пока нет …