【问题标题】:Winforms and Background WorkerWinforms 和后台工作者
【发布时间】:2013-04-18 10:21:45
【问题描述】:

我现在有一个控制台应用程序,它监视文件夹中的文件,然后根据规则和文件名,将任何新文件复制到网络上的某个位置。

我需要使应用程序更漂亮,所以决定使用一个简单的 WinForms 单表单应用程序,它显示状态和“最后更新的文件”类型信息。

控制台应用程序的编写方式是,所有控制台显示信息都通过一个方法,我称之为“通知”,采用两个参数。一个字符串,用于显示我希望用户看到的信息,以及一个 ErrorLevel 枚举,如果“正常”以绿色文本显示,如果警告,则为黄色,如果错误,则为红色。但重点是,我的代码只是使用 'Notify' 方法输出任何文本。

我想将我的控制台应用程序更改为普通类,将其作为 WinForms 项目的后台工作程序运行,并让线程中的 Notify 方法安全地将更新发送到 winforms 应用程序。我认为它可以通过事件来完成,但我不确定处理这个问题的最佳方法是什么。你能提出一种方法来让它工作吗?

有“调用”的做事方式。好吗?比如:

this.BeginInvoke (new MethodInvoker(() => UpdateLabel(s));

这似乎是基本的,但我仍想使用我的 Notify 方法,并让它向 UI 层发送消息。

我还需要控制台应用程序向线程发送消息。例如,“停止”,然后我运行代码以优雅地退出线程……还有“刷新”,它在线程内执行一些逻辑。

另一种选择是将处理类作为服务运行?然后有一个以某种方式连接到系统服务并获取更新的 UI?我从来没有做过这样的事情,但这个过程是要一直运行的......

目前,我的代码正在运行,但 UI 没有更新:

public partial class MainForm : Form
{
    BackgroundWorker _bw = new BackgroundWorker();
    public MainForm()
    {
        InitializeComponent();
    }

    private void MainForm_Load(object sender, EventArgs e)
    {

        _bw.DoWork += bw_DoWork;
        _bw.RunWorkerAsync();
    }

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        var bw = sender as BackgroundWorker;
        var monitor = new Monitor();
        monitor.RunMe();

    }
}

我想我只需要找到一种方法来让我的 Notify 方法在我的线程中发送一条消息或其他东西(我创建的一个对象,带有 Message String 和 ErrorCode 属性?)回到我的 UI,并安全地处理它在用户界面上。

这是类(线程)中的代码...

public class Monitor
    {
        public void RunMe()
        {
            Notify("Checking for network connectivity...", Constants.ErrorLevel.Information);
            if (FileManagement.FolderExists(Constants.FolderToMonitor) == false)
            {
                Notify("Unable to monitor folder - Aborting.", Constants.ErrorLevel.Error);
                Console.ReadKey();
                return;
            }
            Notify("OK", Constants.ErrorLevel.Information);
....
}

注意:Readkey 将被删除..

【问题讨论】:

  • 您想实际使用 BackgroundWorker 类。它是为此目的而设计的。见msdn.microsoft.com/en-us//library/…
  • 谢谢,克雷格。我现在正在尝试,我的班级正在运行代码,但我需要一种方法来让我的 Notify 方法更新调用 UI。
  • 请包括Notify 在控制台版本中所做的一些事情。

标签: c# multithreading backgroundworker


【解决方案1】:

可能有更好的方法,但如果您的 Notify 方法需要与 GUI 交互,请尝试在 BackgroundWorker 上使用 ReportProgress 事件。您可以将对象作为状态参数传递,并且可能只是忽略进度值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多