gpt4 book ai didi

c# - Winforms 和后台 worker

转载 作者:太空宇宙 更新时间:2023-11-03 13:43:39 25 4
gpt4 key购买 nike

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

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

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

我想将我的控制台应用程序更改为普通类,将其作为 WinForms 项目的后台 worker 运行,并让线程中的 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 将被删除..

最佳答案

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

关于c# - Winforms 和后台 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16072511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com