Обратный вызов из неуправляемого c ++ в c # web api для обновления очереди сообщений выдает исключение нарушения прав доступа

У нас есть контроллер веб-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. не уверен, что такое горлышко бутылки / ограничение. Так как каждое сообщение очищает и удаляет любое сообщение, которое есть в очереди, перед записью в него.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]