簡體   English   中英

Winforms和后台工作者

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM