0

在运行长时间操作时,我试图通过 Toast 显示等待消息。我正在使用 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 回答