从非托管C ++回调到C#Web API以更新消息队列引发访问冲突异常

时间:2018-06-21 21:32:10

标签: c# c++ .net asp.net-web-api msmq

我们在C#中有一个Web API控制器,从中我创建了一个后台线程来调用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%。 我不太清楚这是怎么回事,因为Visual Studio调试器不会中断发生异常的位置。

非常感谢您的帮助。

更新

事实证明,问题与从dll调用回调以写入MSMQ的次数有关。不确定瓶颈/限制是什么。由于每条消息都会清除并删除队列中存在的任何消息,然后再写入。

0 个答案:

没有答案