0

WPFアプリケーションでシリアルポートを使用していますが、ログファイルに「このコマンドを処理するのに十分なクォータがありません」などのエラーが多数あります。

この情報源は問題があると思います。私の間違いはどこにありますか?

void barcodeSerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string code = barcodeSerialPort.ReadLine();

        this.Dispatcher.Invoke(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;
            }

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

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
4

2 に答える 2

0

インボークメソッドの代わりにディスパッチャクラスから BeginInvoke を使用してみてください。この呼び出しメソッドは、このエラーの原因となる同じスレッドで呼び出します。beginInvoke メソッドはオブジェクトを UI Thread Queue にディスパッチしますが、これは問題なく機能します。

これを使ってみてください。

 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;
            }

            // ...............
        });     
于 2013-01-10T12:16:39.780 に答える
0

データ受信イベントは独自のスレッド内で発生し、Dispatcher.Invoke()このイベントが gui スレッドに発生するたびに呼び出しを呼び出すことで、そのメソッド内で、ShowDialog()このダイアログが閉じられるまで一時停止する を呼び出します。これにより、データ受信スレッドが中断されます。

したがって、この問題を本当に解決するには、データ受信と GUI タスクを分離する必要があります。データ受信イベント内では、受信したデータをある種のリスト、キューなどに入れるだけです。gui スレッド内では、このリストを定期的に調べて、(おそらくタイマーを使用して) キューに入れ、得られたものに基づいて行動します。

注意:複数のスレッドからリストやキューを操作する必要がある場合 (例: データ受信イベントに項目を追加する、GUI タイマーで項目を削除する)、-namespace を確認し、Task Parallel Library の使用についても検討する必要Concurrentあります。ReactiveExtensions

于 2013-01-10T09:56:31.467 に答える