クラスライブラリは、それが反応し、正しいUIを描くことができます変更のUIプロジェクトに通知しなければなりません。
UI層は、UI層を購読することができるイベントにプロジェクトB(コールバック)に渡す方法からaproachesの数があります。
は、以下のイベントを持つ例です。カスタムイベントの発生の詳細については、hereを参照してください。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
var projectB = new ProjectB();
projectB.OnUpdateStatus += projectB_OnUpdateStatus;
projectB.Run();
}
private void projectB_OnUpdateStatus(string message)
{
MessageBox.Show(message);
}
}
public class ProjectB
{
public delegate void StatusUpdateHandler(string message);
public event StatusUpdateHandler OnUpdateStatus;
public void Run()
{
OnUpdateStatus("Updated");
}
}
あなたは、あなたがビジネスの内側の巨大なメソッドを持って言及していcomemnts、およびビジネスメソッドがまだ処理が終わっていないときにGUI上でいくつかの情報を表示する必要がありますから。
これはスレッドに関するものです。上記の例では動作しますが、実際のスレッドが作業を行うのに忙しいのでUIが更新されないことがあります。バックグラウンドタスクが発生している間、UIがロックアップすることさえあります。
mulitpuleスレッドと上記のaprachを使用すると、別のスレッドでUIを更新できないという問題が見つかります。
background worker threadは、2番目のスレッドで作業を行うことでこの問題を回避しますが、イベントはメインのUIスレッドに戻ります。これにより、UIが喚起され更新されます。
public partial class Form1 : Form
{
private BackgroundWorker _backgroundfWorker;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
_backgroundfWorker = new BackgroundWorker();
_backgroundfWorker.ProgressChanged += OnUpdateStatus;
_backgroundfWorker.DoWork += backgroundWorker1_DoWork;
_backgroundfWorker.WorkerReportsProgress = true;
_backgroundfWorker.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
var b = new ProjectB();
b.OnUpdateStatus += ProjectBOnUpdateStatus;
b.Run();
}
private void ProjectBOnUpdateStatus(string message)
{
_backgroundfWorker.ReportProgress(0, message);
}
private void OnUpdateStatus(object sender,ProgressChangedEventArgs progressChangedEventArgs)
{
MessageBox.Show(progressChangedEventArgs.UserState.ToString());
}
}
*プロジェクトBの情報をプロジェクトAに返信するのは非常に面倒です*これを実証するために[MCVE]を取り上げて説明してください。プロジェクトBのクラスは何をしていますか?これは、共通のコントロールがDLLに保持され、別のプロジェクトのGUI上で動的にロードされる方法です。多分あなたはそのファッションを試みていますか? – t0mm13b
これはどのように動作するのですか。通常は少なくとも3つのプロジェクト、UILogic、2:BusinessLogic、3:Applicationがあり、BusinessLogicからUILogicにデータを送信し、アプリケーションによって表示されます。 –
_プロジェクトBからの情報の送り返しが非常に面倒です(Windowsフォームデータバインディング)(https://msdn.microsoft.com/en-us/library/ef2xyb33(v = vs.110))をチェックしてください。 .aspx) – Fabio