[英]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.