2014-12-03 3 views
0

Я пишу приложение WPF с использованием .NET 4.5. Приложение отобразит данные из последовательного порта. На данный момент я хочу обновить содержимое многострочного текстового поля, используя событие DataReceived в последовательном порту.Как подключить обработчик событий с помощью Dispatcher.Invoke?

Когда я запускаю приложение, прокомментированная строка ниже выдает «An unhandled exception of type 'System.Reflection.TargetParameterCountException' occurred in mscorlib.dll» с «{Parameter count mismatch}» Внутреннее исключение равно null.

Переменная RxString (это член класса) в обработчике событий получает значение из последовательного порта, так что данные поступают из устройства через последовательный порт и в обработчик событий. Я не уверен, как отлаживать это дальше. На основе кода примера, который я нашел для приложения winforms, это кажется правильным.

private void DisplayText(object sender, EventArgs e) 
{ 
    textbox1.AppendText(RxString); 
} 

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    RxString = serialPort1.ReadExisting(); 
    textbox1.Dispatcher.Invoke(new EventHandler(DisplayText)); // *** Exception occurs here 
} 

StackTrace:

at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.Reflection.RuntimeMethodInfo.UnsafeInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.Delegate.DynamicInvokeImpl(Object[] args) 
    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) 
    at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
    at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.ProcessQueue() 
    at System.Windows.Threading.Dispatcher.WndProcHook(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) 
    at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
    at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
    at System.Windows.Threading.Dispatcher.Run() 
    at System.Windows.Application.RunDispatcher(Object ignore) 
    at System.Windows.Application.RunInternal(Window window) 
    at System.Windows.Application.Run(Window window) 
    at System.Windows.Application.Run() 
    at WpfSerial.App.Main() in c:\Users\scott\Documents\Visual Studio 2013\Projects\SerialStuff\WpfSerial\WpfSerial\obj\Debug\App.g.cs:line 0 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

ответ

0

Попробуйте заменить

textbox1.Dispatcher.Invoke(new EventHandler(DisplayText)); 

с этим:

textbox1.Dispatcher.Invoke(DisplayText(RxString)); 

Alter DisplayText(), чтобы принять строку параметров, как это:

private void DisplayText(string rxString) 
{ 
    textbox1.AppendText(rxString); 
} 

Я не думаю, что вам нужен «DisplayText», чтобы быть EventHandler, и вам не нужна «RxString» для глобальной переменной.

Смежные вопросы