私はいくつかのコードを理解しようとしています。ログデータを出力する小さなプログラムです。これは、DataTable によって埋められる DataGridView を含むフォームを作成することによって行われます。フォーム クラスには、リフレッシュ機能 (RefreshPresentation) もあります。BusinessLogic クラスは、DataTable を更新し、フォームで更新機能を呼び出すという実際の作業を行います。だから私は機能をかなり理解していますが、プログラムがそのように構成されている理由はわかりません。
- businessLogic.DoWork が通常のメソッド呼び出しではなく、スレッドとして実行されるのはなぜですか?
- RefreshPresentation 機能について誰か説明してもらえますか? (BeginInvoke とデリゲート)
- MainForm をパラメーターとして BusinessLogic に渡すことは良い考え/実践ですか?
これは、アプリケーションのメイン エントリ ポイントです。
public class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
これはフォームの関連部分です。
public partial class MainForm : Form
{
private BusinessLogic businessLogic;
private DataTable viewDataTable;
public MainForm()
{
InitializeComponent();
businessLogic = new BusinessLogic(this);
Thread t = new Thread(new ThreadStart(businessLogic.DoWork));
t.Start();
}
public delegate void RefreshPresentationDelegate(DataTable dataTable);
public void RefreshPresentation(DataTable dataTable)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new RefreshPresentationDelegate(RefreshPresentation), new object[] { dataTable });
return;
}
...
これがビジネスロジックです。
internal class BusinessLogic
{
private MainForm form;
private Logging.DAL.Logger loggerDAL;
private int lastId;
internal DataTable DataTable { get; private set; }
internal bool IsRunning { get; set; }
public BusinessLogic(MainForm form)
{
this.form = form;
this.loggerDAL = new Logging.DAL.Logger();
this.IsRunning = true;
DataTable = new DataTable();
}
public void DoWork()
{
while (this.IsRunning)
{
// Get new log messages.
if (DataTable.Rows.Count > 0)
this.lastId = (int)DataTable.Rows[DataTable.Rows.Count - 1]["Id"];
this.DataTable = loggerDAL.GetLogMessagesSinceLastQuery(lastId);
// Callback to GUI for update.
form.RefreshPresentation(this.DataTable);
// Wait for next refresh.
Thread.Sleep(1000);
}
}
}