0

長い操作の実行中にトーストを介して待機中のメッセージを表示しようとしています。私は BackgroundWorker を使用しています。このコードは、ListView_ItemClick イベント ハンドラー内にあります。

var bgWait = new BackgroundWorker();
bgWait.DoWork += bgWait_DoWork;
bgWait.RunWorkerAsync();
bgWait.RunWorkerCompleted += bgWait_Completed;

bgWait_DoWork イベント ハンドラーのコードは次のとおりです。

private void bgWait_DoWork(object sender, DoWorkEventArgs e)
{
var toastWait = Toast.MakeText(this, "Please wait", ToastLength.Long);
toastWait.SetGravity(GravityFlags.Top & GravityFlags.Center, 0, 0);
toastWait.Show();
TimeConsumingOperation();
toastWait.Cancel();
}

デバッグ モードで実行すると、bgWait_DoWork の最初の行にしか到達していないようです - "var toastWait = Toast.MakeText(this, "Please wait", ToastLength.Long);" - そして、bgWait_Completed イベント ハンドラにジャンプします。

なぜこれが起こっているのですか?

ありがとう

4

1 に答える 1

2

セカンダリ スレッドから UI 関連の API を呼び出しています (bgWait_DoWork はセカンダリ スレッドで実行されます)。

代わりに、次のようにする必要があります。

private void bgWait_DoWork(object sender, DoWorkEventArgs e)
{
    Toast toastWait = null;
    RunOnUIThread (() => 
    {
        toastWait = Toast.MakeText(this, "Please wait", ToastLength.Long);
        toastWait.SetGravity(GravityFlags.Top & GravityFlags.Center, 0, 0);
        toastWait.Show();
    });
    TimeConsumingOperation();
    RunOnUIThread (() =>
    {
        toastWait.Cancel(); 
    });
}

}

于 2012-11-07T11:35:02.990 に答える