是否将WPF调度程序转换为Winforms BGworker?

是否将WPF调度程序转换为Winforms BGworker?,wpf,winforms,multithreading,backgroundworker,dispatcher,Wpf,Winforms,Multithreading,Backgroundworker,Dispatcher,我最近获得了一些服务器控制台包装器的源代码。该程序最初是在WPF中编写的,部分代码是: private void ServerProc_ErrorDataReceived(object sender, DataReceivedEventArgs e) { Dispatcher.Invoke(new Action(() => { ConsoleTextBlock.Text += e.Data + "\r\n";

我最近获得了一些服务器控制台包装器的源代码。该程序最初是在WPF中编写的,部分代码是:

    private void ServerProc_ErrorDataReceived(object sender, DataReceivedEventArgs e)
    {
        Dispatcher.Invoke(new Action(() =>
        {
            ConsoleTextBlock.Text += e.Data + "\r\n";
            ConsoleScroll.ScrollToEnd();
        }));
    }
    private void ServerProc_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        Dispatcher.Invoke(new Action(() =>
        {
            ConsoleTextBlock.Text += e.Data + "\r\n";
            ConsoleScroll.ScrollToEnd();
            ParseServerInput(e.Data);
        }));
    }
它的两个空洞中也有此注释:

//您必须通过Dispatcher执行此操作,因为此方法是 由另一个线程调用

然而,在WinForms中没有这样的东西——有没有办法将其更改为后台工作程序或其他什么(我几乎没有做过任何多线程)

如果有人能帮忙,那太好了


谢谢。

这两种方法都是事件处理程序。它们很可能来自某种侦听代码,我希望它们是从非UI线程(例如通常是执行侦听的线程池线程)调用的。您可以通过设置断点并查看调试器中的“线程”窗口来检查这一点。
因此,您需要应用winforms方法从非UI线程更新UI。
如果你这样搜索,你会发现很多关于如何做到这一点。例如


某些背景:不允许在UI线程以外的线程中运行的进程直接访问任何UI控件。您的WPF ServerProc运行在与您的UI不同的线程中,这需要
调度程序
帮助您从ServerProc线程返回到UI线程中的UI控件

如果您的ServerProc(在WPF或WinForms中)在UI线程中运行,则不需要使用
Dispatcher.Invoke
调用来包围它

对于您,您可以将ServerProc放在一个文件夹中。您的
DoWork
方法将包含执行该工作的代码的内容,然后根据ServerProc的工作方式,您可能可以使用
ProgressChanged
来执行两个示例WPF方法正在执行的操作
ProgressChanged
传入了一个参数,您可以指示它是错误还是收到了数据,并且在函数中可以显示相应的信息。看看MSDN文档,因为它们有一个很好的例子

需要指出的是,
ProgressChanged
发生在UI线程上,因此您不需要用Invoke来包围对UI控件的调用;正常地给他们打电话就行了。
RunWorkerCompleted
也是如此,它可能是ServerProc完成其工作后显示数据的另一个选项


最后,如果您实际上必须从线程中访问UI控件,那么您可以执行与WPF代码示例非常相似的操作。看看与Dispatcher不同,您实际上只是从主窗体调用它。

谢谢,但我不太确定如何将其应用到我的代码中-我在VB.NET中做得更好,仍然习惯于C#问题是ServerProc方法和事件处理程序都是事件处理程序-并且将由非UI线程上的现有代码调用。我知道BackgroundWorker在这种情况下可以提供什么帮助?我认为他不想重写现有的服务器监听/事件触发代码-只是事件处理程序-在非UI线程上已经有了;我使用了方法调用器!不,我终于可以启动这个应用程序了。帮了大忙。谢谢。@AlexOgden如果这为您提供了解决方案,那么您应该单击左侧的勾号将其标记为已接受的答案。