2013-01-10 50 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; 
      } 

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