C# Task.StartNew.ReceiveAsync()在从MSMQ接收消息时工作不正常

C# Task.StartNew.ReceiveAsync()在从MSMQ接收消息时工作不正常,c#,task-parallel-library,task,msmq,C#,Task Parallel Library,Task,Msmq,我正在使用这个URL的实现阶段,它在我以前使用时运行良好,一段时间后它不工作了,我不知道发生了什么?花了一段时间后,我得出结论,程序停止在特定的方法 /// <summary> /// APM -> TAP conversion for MessageQueue.Begin/EndPeek. /// </summary> private static Task<Message> PeekAsync(MessageQueue mes

我正在使用这个URL的实现阶段,它在我以前使用时运行良好,一段时间后它不工作了,我不知道发生了什么?花了一段时间后,我得出结论,程序停止在特定的方法

/// <summary>
    /// APM -> TAP conversion for MessageQueue.Begin/EndPeek.
    /// </summary>
    private static Task<Message> PeekAsync(MessageQueue messageQueue)
    {
        return Task.Factory.FromAsync(messageQueue.BeginPeek(), messageQueue.EndPeek);
    }
然后程序终止,没有异常,也没有任何事情发生。只是程序被终止

从我的角度来看,
Task.Factory.fromsync()
是一个原因,但不是不明白为什么


如果我使用与接收消息相同的队列作为
BeginReceive()
eventhandler,它工作正常。如何识别这一点???

ReceiveAsync
函数中,
fromsync
的第二个参数应该是
messageQueue.EndReceive
,而不是
messageQueue.EndPeek

第一件事

正如@xwlantian指出的那样。你把你的APM方法对搞混了

您应该始终将
BeginXXX
与正确的
EndXXX
方法相匹配。否则你会得到一个例外

就你而言

Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndPeek)
应该读

Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndReceive)
但是,如果您有正确的信息(异常/堆栈跟踪),您应该能够自己解决这个问题。你声称丢失了

事实并非如此

您没有看到异常的原因是VisualStudio没有对异常进行
中断
(这是“查找”异常的典型方式)。相反,您可以查看您的Windows事件查看器,您应该可以在那里找到异常

为什么你没有“看到”异常? 以下是事实

  • 您的异常发生在堆栈中没有try/catch对的后台线程上
  • 您在AppDomain上没有异常处理程序
  • 您已在“调试”设置中签入“仅我的代码”

  • 我也用同样的一对测试过,但不起作用。稍后我检查了您提供的信息,但是如何测试
    Task.Factory.fromsync(messageQueue.BeginReceive(timeout),messageQueue.EndReceive)由于这是一个新任务,并且它的实现是隐藏的,所以当调试器运行这一行时,退出的任务越多。请解释一下,你有没有看过我让你看的例外情况?我的灵力只能带我走这么远。如果您需要更多帮助,请告诉我您的异常/堆栈跟踪。在该点上没有发生异常,程序在该行终止,堆栈跟踪屏幕在程序终止后消失。您是对的,我也实现了相同的事情,但不起作用。您可以订阅当前
    AppDomain
    UnhandledException
    Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndReceive)