none
請問當MSMQ內沒資料時會出現-1073741536的錯誤 RRS feed

  • 問題

  • 小弟之前有寫一個有表單的MSMQ的程式..讀取起來都很正常

     

    但是現在寫一個新的MSMQ的DLL一個沒有表單的程式使用,很簡單的程式碼,但只要碰到一開始MSMQ內沒有任何一筆資料的話就出現-1073741536的錯誤,但是只要有存放資料的話,程式就不會有任何Error

    目前以下改法可以正常執行(我在有產生ex時重新做一次reload的動作)

     

    但是想到為何之前同樣的寫法,碰到msmq是空的時後就不會有error

    現在改成dll給其他程式使用,就有產生

    讓我百思不得其解

    所以想請教一下

      System.Messaging.MessageQueue messageQueue1 = new System.Messaging.MessageQueue();
    
    
    
      public void ReadMSMQ()
    
      {
    
       try
    
       {
    
        
    
        messageQueue1.Path = _MSMQPath; 
    
    
    
        messageQueue1.Formatter = new ActiveXMessageFormatter();
    
     messageQueue1.PeekCompleted += new PeekCompletedEventHandler(messageQueue1_PeekCompleted);
    
        messageQueue1.BeginPeek();
    
        
    
       }
    
       catch (Exception ex)
    
       {
    
        throw new Exception("ReadMSMQ錯誤_" + ex.ToString());
    
       }
    
      }
    
    
    
    
    
      public void messageQueue1_PeekCompleted(object sender, PeekCompletedEventArgs e)
    
      {
    
       try
    
       {
    
    
    
        System.Messaging.Message msg = messageQueue1.EndPeek(e.AsyncResult); //*******這邊會出錯
    
       }
    
       catch (MessageQueueException ex)
    
       {
    
        if ((int)ex.MessageQueueErrorCode == -1073741536)
    
        {
    
         ex = null;
    
        }
    
        ReadMSMQ(); //再次reload時就不會再次產生error
    
    
    
       }
    
       catch (Exception ex)
    
       {
    
        Console.WriteLine(ex.GetBaseException());
    
       }
    
      }
    
    
    2010年12月14日 上午 03:22

解答

  • 問題你有沒有把建構函式移到 ReadMSMQ() 方法中 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 神戶 2010年12月14日 上午 06:03
    2010年12月14日 上午 04:02
    版主

所有回覆

  • 另一種可能是messageQueue1 參考的問題, 你將其建構函式移到 ReadMSMQ() 方法中

    而在 messageQueue1_PeekCompleted 方法使用sender 參數來轉型為MessageQueue物件

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年12月14日 上午 03:54
    版主
  • 試看看套用MTA屬性

    http://msdn.microsoft.com/zh-tw/library/bw5eztxb(v=VS.80).aspx


    小弟嘗試看看

     

     

    2010年12月14日 上午 03:58
  • 另一種可能是messageQueue1 參考的問題, 你將其建構函式移到 ReadMSMQ() 方法中

    而在 messageQueue1_PeekCompleted 方法使用sender 參數來轉型為MessageQueue物件

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    小弟嘗試過使用

     System.Messaging.Message msg = (MessageQueue)sender.EndPeek(e.AsyncResult);

     

    這樣也是一樣說^^"

    2010年12月14日 上午 03:59
  • 問題你有沒有把建構函式移到 ReadMSMQ() 方法中 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 神戶 2010年12月14日 上午 06:03
    2010年12月14日 上午 04:02
    版主
  • 您好

     

    您是說這樣嗎

        public void ReadMSMQ()
        {
          try
          {
            System.Messaging.MessageQueue messageQueue1 = new System.Messaging.MessageQueue();
            messageQueue1.Path = _MSMQPath; 
            messageQueue1.PeekCompleted += new PeekCompletedEventHandler(messageQueue1_PeekCompleted);
            messageQueue1.Formatter = new ActiveXMessageFormatter();
    
            messageQueue1.BeginPeek();
            
          }
          catch (Exception ex)
          {
            throw new Exception("ReadMSMQ錯誤_" + ex.ToString());
          }
        }
    這樣還是一樣耶^^"
    2010年12月14日 上午 04:25
  • 小第知道為何了@@

     

    我載入dll後

    使用的是

    public static MSMQLibrary.MSMQ Msmq = new MSMQLibrary.MSMQ();
    

    應該只能用

    public MSMQLibrary.MSMQ Msmq = new MSMQLibrary.MSMQ();

    ================================

     

    說錯了

     

    找到正確錯誤原因,不是以上...=3=

    應該是

    我從MAIN進入後

    執行了以下指令
    Tcp8Door XXX = new Tcp8Door();
    XXX.Run();

     

    結果開啟與讀取MSMQ的程序寫在RUN()裡面

    在主控台應用程式中RUN()執行完會跳出

    但是因為我有其他執行緒在執行While(true)..所以畫面還是會繼續跑

     

    現在在RUN下面加入Thread.Sleep(Timeout.Infinite);

    就正常了

    2010年12月14日 上午 06:07