2013-01-10 98 views
0

我正在使用我的WPF應用程序中的串行端口, ,並且在日誌文件中有很多錯誤,例如「沒有足夠的配額來處理此命令」。在C#中使用串行端口

這個來源我認爲與問題。我的錯誤在哪裏?

​​
10.01.2013 10:05:08 - Exception on UI Thread (Dispatcher) 
Exception message - There is not enough quota to process this command 
Source - WindowsBase 
StackTrace - at MS.Win32.UnsafeNativeMethods.PostMessage(HandleRef hwnd, WindowMessage msg, IntPtr wparam, IntPtr lparam) 
    at System.Windows.Interop.HwndTarget.UpdateWindowSettings(Boolean enableRenderTarget, Nullable`1 channelSet) 
    at System.Windows.Interop.HwndTarget.UpdateWindowPos(IntPtr lParam) 
    at System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr wparam, IntPtr lparam) 
    at System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
TargetSite -Void PostMessage(System.Runtime.InteropServices.HandleRef, MS.Internal.Interop.WindowMessage, IntPtr, IntPtr) 
InnerException.Message - NULL 
+0

發佈詳細的錯誤消息,以及堆棧跟蹤等。配額似乎不是串行端口可能存在的問題。 –

回答

0

接收到的事件將它自己的線程中調用Dispatcher.Invoke()被解僱的數據調用每次該事件被觸發回GUI線程和方法中你要打電話一個ShowDialog()將暫停,直到此對話框關閉,這將暫停您的調度程序,這將暫停您的數據接收線程。

所以要真正解決這個問題,你必須解耦數據接收和gui任務。在數據接收事件中,只需將接收到的數據放入某種列表,隊列等中即可。在gui線程中,你經常看看這個列表,排隊(可能通過使用一個計時器),並根據你得到的結果採取行動。

當心:如果你需要操作列表,從多個線程隊列(如加在接收到的事件數據項,刪除GUI定時器的項目),你應該在Concurrent-namespace看看,想想也是的用法Task Parallel LibraryReactiveExtensions

+0

好吧,我會嘗試, ,但我認爲有更簡單和優雅的方式來解決這些問題 –

+0

@БахрамХоджаев:使用TPL和Rx是優雅的方式。等到我忘記了:在.Net 4.5和VS2012中,你也可以使用[async,await](http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx)。 – Oliver

0

嘗試使用調度程序類中的BeginInvoke確保調用方法。這個invoke方法在導致這個錯誤的同一個線程上調用。並且beginInvoke方法將把對象分派到UI線程隊列中,這對於這一點很好。

嘗試使用此。

this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate() 
     {     
      if (new DateTime(model.ComebackDate.Year, model.ComebackDate.Month, model.ComebackDate.Day) > DateTime.Now) 
      { 
       new WndMessage("Date time error...").ShowDialog(); 
       Switcher.Switch(new MainMenu()); 
       return; 
      } 

      // ............... 
     });