WPF 和 WinForms 中的 BeginInvoke 行为不同

问题描述 投票:0回答:1

我正在 WPF 中开发一个应用程序。它使用串行端口连接。我创建了一个类来包装串行端口连接并管理缓冲区等。

我在编写 C# WinForms 应用程序 (.NET6) 时开发了它。为了允许串行端口事件更新主窗体上的文本框并将接收到的字节发送到数据包处理程序,我创建了一个委托并使用 BeginInvoke 来运行它。效果很好。

我采用了相同的包装器并将其包含在新的 WPF 应用程序中,而没有包含文本框更新/数据包处理程序只是为了开始(因此,仅发送字节)。它也运行良好。我取消注释了包装器的接收部分,并且所有内容仍然可以正常编译(但是当然,如果主窗体上没有代码,则不会处理传入的字节)。

当我将代码添加到主窗体以调用委托时,出现编译错误。起初我以为是.NET6/.NET8的东西,但是我打开旧项目并更改了目标.NET,它仍然运行良好。

所以,我想知道这是否是 WinForms 与 WPF 的问题。错误是:

CS1501 方法“BeginInvoke”没有重载需要 3 个参数

然而,完全相同的代码在旧项目中编译并运行。

这是有问题的代码:

    void ProcessRecievedByte_Callback(object sender, byte rcvdByte)
    {
        this.BeginInvoke(new ES_UART.RxBufferRemoveByteEventHandler(ES_RxBufferProcessor), sender, rcvdByte);
    }

    void ES_RxBufferProcessor(object sender, byte e)
    {
       switch (receiveState)
        {
            case receive_state.WAITING_FOR_SOP:
                if (e == '$')
                {
                    receiveState = receive_state.IN_A_PACKET;
                    packetIndex = 0;
                    packetBuffer[packetIndex] = e;
                    packetIndex++;
                }
                break;
            case receive_state.IN_A_PACKET:
                if (packetIndex < MAX_PACKET_SIZE)
                {
                    packetBuffer[packetIndex] = e;
                    packetIndex++;
                }
                if (e == '\n')
                    receiveState = receive_state.PACKET_RECIEVED;
                break;
            case receive_state.PACKET_RECIEVED:
                break;
        }
    }

如有任何帮助,我们将不胜感激。

谢谢

c# wpf begininvoke
1个回答
0
投票

这是在 WPF 中构建调用的一种方法;如果您最终想要使用 Invoke 更新 UI。您需要获取要更新的窗口的调度程序。在此示例中,_window 是对“目标”窗口的引用。

_window.Dispatcher.Invoke( 
   DispatcherPriority.Background, 
   new Action<int>( _window.IncrementProgress ), 
   increment );

(您可以替换您自己的 Action<...> 和参数)

© www.soinside.com 2019 - 2024. All rights reserved.