如何从Task.Run(Xamarin.Android)中的函数获取返回结果?

时间:2019-01-11 10:30:49

标签: xamarin.android task progressdialog

我的活动中有以下观点:

private Button btn;
private TextView txtView;

我有以下按钮单击事件:

private async void Btn_Click(object sender, System.EventArgs e)
{
     var mDialog = new ProgressDialog(this);
     mDialog.SetMessage("Loading data...");
     mDialog.SetCancelable(false);
     mDialog.Show();

     string str;

     await Task.Run((() => str = Foo()));
     // Alternatively
     // await Task.Delay(10000);

     mDialog.Dismiss();

     txtView.Text = str;


}

我还有以下方法:

string Foo()
{
    for (int i = 0; i < 10; i++)
    {
        Thread.Sleep(1000);
    }

    return "hello";
}

我想要的是将txtView.Text解雇后将hello设置为ProgressDialog

2 个答案:

答案 0 :(得分:0)

Task.Run并不是要像它那样被使用,就是将指定的工作排队在ThreadPool上运行,并为该工作返回一个任务或Task<TResult>句柄。

您应该做的是制作一个返回类型为Task<string>的方法,然后等待该方法

然后使用该方法更新您的textview数据

答案 1 :(得分:0)

解决方案:

您可以通过关闭SetOnDismissListener后使用ProgressDialog来设置关闭监听器。

首先,让您的活动继承自IDialogInterfaceOnDismissListener

public class MainActivity : AppCompatActivity, IDialogInterfaceOnDismissListener

在按钮单击事件中,将activity设置为listener

        private async void Btn_Click(object sender, System.EventArgs e)
    {
        var mDialog = new ProgressDialog(this);
        mDialog.SetMessage("Loading data...");
        mDialog.SetCancelable(false);

        //set your activity as the listener
        mDialog.SetOnDismissListener(this);

        mDialog.Show();
        await Task.Delay(10000);
        mDialog.Dismiss();

    }

然后,您应该实现interface(IDialogInterfaceOnDismissListener)成员OnDismiss,在此函数中,您可以在关闭ProgressDialog之后执行您想做的任何事情:

public void OnDismiss(IDialogInterface dialog)
{

    Toast.MakeText(this, "You used the 'SetOnDismissListener'.", ToastLength.Long).Show();

    txtView.Text = "hello";
}

您可以参考:

IDialogInterfaceOnDismissListener

using-setondismisslistener-with-dialog