簡単なテキスト文字列でGUIを定期的に更新する方法を理解したいと思います。基本的に、私は定期的にTwitterをポーリングして更新を行うTwitterアプリケーションを作成しています。更新の内容をテキストブロックに1つずつ一定のループで表示したいと思います。
GUIの応答性を維持するには、バックグラウンドワーカースレッドでクエリを実行する必要がありますが、このスレッドからGUIを更新することはできません。学習者として、私はイベントを使用してGUIを更新する方法を実装するのに苦労しています。
以下の私のコードでは、「MainWindowGoUpdate」が「間違ったスレッド」にあることを理解していますが、GUIスレッドにイベントをリッスンさせるにはどうすればよいですか?
ポインタをいただければ幸いです。
public partial class MainWindow : Window
{
public MainWindow()
{
public static event UpdateTimeLineEvent _goUpdate;
public static string TheTimeLine;
UpdateTimeLine();
}
private void UpdateTimeLine()
{
txtb_timeline.Text = "Updating...";
BackgroundWorker startTimelineUpdater = new BackgroundWorker();
startTimelineUpdater.DoWork += new DoWorkEventHandler(startTimelineUpdater_DoWork);
startTimelineUpdater.RunWorkerCompleted += new RunWorkerCompletedEventHandler(startTimelineUpdater_RunWorkerCompleted);
startTimelineUpdater.RunWorkerAsync();
}
void startTimelineUpdater_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
Xtweet getSQL = new Xtweet();
var sqlset = getSQL.CollectLocalTimelineSql();
int i = 0;
while (i < 10)
{
foreach (var stringse in sqlset)
{
StringBuilder sb = new StringBuilder();
sb.Append(stringse[0] + ": ");
sb.Append(stringse[1] + " @ ");
sb.Append(stringse[2]);
sb.Append("\n");
TheTimeLine = sb.ToString();
_goUpdate += new UpdateTimeLineEvent(MainWindowGoUpdate);
_goUpdate.Invoke();
Thread.Sleep(10000);
i++;
}
}
}
}
void MainWindowGoUpdate()
{
txtb_timeline.Text = TheTimeLine;
}
void startTimelineUpdater_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
txtb_timeline.Text = "should not see this";
}
}