일부 코드를 이해하려고합니다. 로그 데이터를 출력하는 작은 프로그램입니다. DataTable으로 채워진 DataGridView로 양식을 작성하면됩니다. 양식 클래스에는 새로 고침 기능 (RefreshPresentation)도 있습니다. BusinessLogic 클래스는 DataTable을 업데이트하고 폼에서 새로 고침 함수를 호출하는 실제 작업을 수행합니다. 그래서 나는 그 기능을 꽤 많이 이해하지만, 왜 프로그램이 어떻게 구성되어 있는지를 이해하지 못합니다.logreader를 이해하려고 시도했습니다.
- 일반 메서드 호출 대신 businessLogic.DoWork가 스레드로 실행되는 이유는 무엇입니까?
- 나를 위해 RefreshPresentation 함수를 설명 할 수 있습니까? (BeginInvoke 및 대리자)
- MainLogic을 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);
}
}
}
많은 도움이되었습니다. 고맙습니다. –