私はバックグラウンドで多くのタスクを実行するwpfアプリケーションを作成していますが、UIは応答性があり、さまざまなバックグラウンドタスクのステータスを表示する必要があります。また、UIをまったく表示しないオプションもあります。この場合、メインフォームのインスタンスをまったく作成せずにステータスメッセージを破棄する必要があります。私がしようとしてきた何バックグラウンドスレッドの情報でWPFウィンドウを更新するにはどうすればよいですか?
がApp.xamlから
StartupUri="MainWindow.xaml"
を削除することです。その後、App.xaml.csでは、私はこれが必要な場合は、メインフォームを示しており、すべてのバックグラウンド・プロセスを開始し
`
public App()
{
Startup += new StartupEventHandler(App_Startup);
}
void App_Startup(object sender, StartupEventArgs e)
{
// Code which loads application settings is here
if (pf.ShowUI)
{
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
}
// The background processes will begin here.
}`
を持っています。この部分は動作します。
UIにバックグラウンドからのメッセージを送信するためには、私は非常に基本的なメッセンジャー実装しました:
`
internal interface IMessageHandler
{
void ReceiveMessage(string message);
}
internal class Messenger
{
private static List<IMessageHandler> _handlers;
internal static void AddHandler(IMessageHandler handler)
{
_handlers.Add(handler);
}
internal static void RemoveHandler(IMessageHandler handler)
{
try
{
_handlers.Remove(handler);
}
catch (Exception ex) {}
}
internal static void Broadcast (string message)
{
foreach (IMessageHandler handler in _handlers)
{
handler.ReceiveMessage(message);
}
}
}`
をメインフォームはIMessageHandlerインタフェースを実装し、に自分自身を追加します起動時のハンドラとしてのメッセンジャー。メインフォームにステータスを送信する必要があるプロセスは、メッセンジャーのBroadcast
メソッドを呼び出すだけです。
私が抱えている問題は、バックグラウンドプロセスが完了するまでメッセージがフォームに表示されず、UIがロックされていることです。なぜ私のバックグラウンド・プロセスは、私のUIを凍結している
`
public void ReceiveMessage(string message)
{
Dispatcher.Invoke(DispatcherPriority.Normal,
new Action<string>(AddText),
message);
}
private void AddText(string text)
{
Label myLabel = new Label();
myLabel.Content = text;
stackPanel1.Children.Add(myLabel);
if (stackPanel1.Children.Count > 5)
{
stackPanel1.Children.RemoveAt(0);
}
}`
次のように
受信メッセージを処理するUIのコードはありますか?それを防ぐために私は何ができますか?そして、私のUIがステータスメッセージで更新されないのはなぜですか?
パターンをMVVMとして使用して、ビューをモデルデータにバインドすることを検討してください。 – HyLian