私はこの問題を解決するために2時間以上費やしました.誰かが私を助けることができれば素晴らしいでしょう.. :)
基本的に、私がしようとしているのは、LINQ と Web サービスを使用してデータベースにクエリを実行し、情報を取得するアプリケーションです。
結果からいくつかの情報を抽出し、.CSV ファイルに書き込みます。
ロギングを除いて、すべてが完全に機能します。
UI がフリーズしたくないので、バックグラウンド ワーカーを実装しました。
ロガー テキスト ボックスをバックグラウンド ワーカーに渡し、静的 Web サービス メソッドからの進行状況を書き込みます。
using TextBoxAsAlias = System.Windows.Controls.TextBox;
ここで初めてロガー テキスト ボックスに書き込みますが、これは完全に機能します。
private void btnExecute_Click_1(object sender, RoutedEventArgs e)
{
// Register background worker
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
// Flush the content of the logger textbox
txtboxLogger.Clear();
txtboxLogger.AppendText("#########################" + Environment.NewLine);
txtboxLogger.AppendText("# Logger - " + DateTime.Now.ToString("T") + "#" +
txtboxLogger.AppendText("#########################" + Environment.NewLine + Environment.NewLine);
worker.RunWorkerAsync(new Object[] {txtboxLogger });
}
ここで問題が発生します:
ご覧のとおり、DoWork メソッドでテキストを再度ログに記録しようとしています。問題は、worker_DoWork が終了したときにテキスト全体がログに記録されることです。その結果、5分間待ってもロガーのテキストボックスに何も起こらず、終了するとすぐにすべてが一度に書き込まれます。
void worker_DoWork(object sender, DoWorkEventArgs e)
{
Object[] parameter = (Object[])e.Argument;
TextBoxAsAlias textboxLogger = (TextBoxAsAlias)parameter[0];
textboxLogger.Dispatcher.InvokeAsync((Action)(() =>
{
txtboxLogger.AppendText(DateTime.Now.ToString("T") + " - Start processing ... " + Environment.NewLine);
if (isAutoSelection)
{
// Execute Webservice with auto selection
RandomDoWorkMethod(null, context, credential, dateStart, textboxLogger);
}
else
{
// Read în the Numbers + hand it over to the webservice for further computing
RandomDoWorkMethod(ReadInputFile(), context, credential, dateStart, textboxLogger);
}
}));
}
最後だけでなく、バックグラウンド ワーカー中にすぐにログ ファイルに書き込む方法を知っている人はいますか?
他のメソッドで次のコードをさらに使用しますが、すべてのメソッドが worker_DoWork スレッドにあるため、結果は同じです。
textboxLogger.Dispatcher.InvokeAsync((Action)(() =>
{
))};
よろしくお願いします。
よろしく
ジョージ