我们在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的次数有关。不确定瓶颈/限制是什么。由于每条消息都会清除并删除队列中存在的任何消息,然后再写入。