[英]Winforms and Background Worker
目前,我有一个控制台应用程序,它监视文件夹中的文件,然后根据规则和文件名将所有新文件复制到网络上的某个位置。
我有一个使应用程序更美观的要求,因此决定使用一个简单的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,并在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事件。 您可以将对象作为状态参数,并且可能只是忽略进度值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.