I’m developing a database application for Windows Phone 7.5 (mango). I trying (during tapping on a button) to update a textblock with the text “Searching…” This button performs a rather lengthy search in a big table and thus I want to inform the user. However everything I trying is failed! Here is one of the code snippets that I used. Is there any way to achieve this? Any help helping me understand what’s wrong would be appreciated.
private void btnSearch_Tap(object sender, GestureEventArgs e)
{
workerThread = new Thread(new ThreadStart(turnVisibilityOn));
workerThread.Start();
while (!workerThread.IsAlive) ;
Thread.Sleep(500);
//Search database takes about 15 sec on windows phone device!
Procedures[] results = CSDatabase.RunQuery<Procedures>(@"select Code, Description from tblLibraries where Description like '%" +
textBox1.Text + "%' or Code like '%" + textBox1.Text + "%'");
this.MyListBox.ItemsSource = results;
// Of course this not work
Search1.Text = ""
}
private void turnVisibilityOn()
{
// Inform the user updating the Search1 textblock
// UIThread is a static class -Dispatcher.BeginInvoke(action)-
UIThread.Invoke(() => Search1.Text = "Searching...");
}
public static class UIThread
{
private static readonly Dispatcher Dispatcher;
static UIThread()
{
// Store a reference to the current Dispatcher once per application
Dispatcher = Deployment.Current.Dispatcher;
}
/// <summary>
/// Invokes the given action on the UI thread - if the current thread is the UI thread this will just invoke the action directly on
/// the current thread so it can be safely called without the calling method being aware of which thread it is on.
/// </summary>
public static void Invoke(Action action)
{
if (Dispatcher.CheckAccess())
action.Invoke();
else
Dispatcher.BeginInvoke(action);
}
}
I am not sure I understand the problem correctly.
The “Searching…” text does not show up? The
line doesn’t work? (Why do you write “Of course this not work”? Why wouldn’t it work?)
I don’t understand why you change the text to “Searching…” in a background thread. You could do it in the UI thread, and make the time-consuming work in the background thread, something like this (I switched to using a ThreadPool):
You always have to manipulate the UI elements from the UI thread (on which the event handler runs) and you have to do the time-consuming work in a background thread.