我现在有一个控制台应用程序,它监视文件夹中的文件,然后根据规则和文件名,将任何新文件复制到网络上的某个位置。
我需要使应用程序更漂亮,所以决定使用一个简单的WinForms单一表单应用程序来显示状态和“上次更新的文件”类型信息。
控制台应用程序的编写方式是所有控制台显示信息都通过一个方法,我称之为“通知”,采用两个参数。一个字符串,用于显示我希望用户看到的信息,以及一个ErrorLevel枚举,如果“正常”显示为绿色文本,如果是警告,则为黄色,如果错误,则为红色。但重点是,我的所有代码都是使用'Notify'方法输出任何文本。
我想将我的控制台应用程序更改为普通类,从WinForms项目中将其作为后台工作程序运行,并让线程中的Notify方法安全地向winforms应用程序发送更新。我认为可以用事件来完成,但我不确定处理这个问题的最佳方法是什么。你能提出一种方法来实现这个目的吗?
有'调用'做事方式。好吗?类似的东西:
this.BeginInvoke (new MethodInvoker(() => UpdateLabel(s));
它似乎是基本的,但我仍然希望使用我的Notify方法,并将消息发送到UI层。
我还需要控制台应用程序向线程发送消息。例如,'Stop',然后我运行优雅地退出线程的代码......还有'Refresh',它在线程中执行一些逻辑。
另一种选择是将处理类作为服务运行吗?然后有一个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将被移除..
答案 0 :(得分:1)
可能有更好的方法,但如果您的Notify方法需要与GUI交互,请尝试在BackgroundWorker上使用ReportProgress事件。您可以将对象作为状态参数传递,并且可能只是忽略进度值。