Xamarin开发。任务即将完成。我需要有关线程的建议

时间:2017-07-25 18:43:47

标签: c# android multithreading xamarin

我有一个方法,我用它来让用户输入时间。我已经设置了一旦按下按钮就会打开一个对话框。然后,用户可以选择时间,一旦用户选择填充文本视图的时间,但是我发现一旦对话框打开,则为textview分配其默认值null。它不等待。

当我使用Toast消息运行测试时,我可以看到底层代码确实有效但是它的顺序让我烦恼。

目前我试图实施await功能但没有用。

我附上了我的代码。感谢您的帮助或建议。顺便说一下,我对c#和xamarin来说相当新。

        <<within on create>> 
      StartTimePickerBTN.Click += async delegate
        {
            OnCreateDialog().Show();


            StartTimeTV.Text = (await UpdateTime()).ToString();

        };

    private void TimePickerCallback(object sender, TimePickerDialog.TimeSetEventArgs e)
    {
        hour = e.HourOfDay;
        minute = e.Minute;
    }

    public async Task<string> UpdateTime()
    {
        string time = string.Format("{0}:{1}", hour, minute.ToString().PadLeft(2, '0'));

        return time;
    }

2 个答案:

答案 0 :(得分:0)

您不是在等待UpdateTime的来电,而是在{}返回的.ToString()上拨打Task,而不是string

您的事件处理程序应该

StartTimeTV.Text = (await UpdateTime()).ToString();

答案 1 :(得分:0)

我设法解决了我的问题但是我确定它不是最好的方法,但我会在下面发布我的代码。

现在加号是TextView在正确的阶段填充并等待用户选择。

    Within OnCreate, Please note the bool is a class wide variable

      StartTimePickerBTN.Click += delegate
        {
            SelectStartOrEndTime = true;

            OnCreateDialog().Show();

        };

        EndTimePickerBTN.Click += delegate
        {
            SelectStartOrEndTime = false;

            OnCreateDialog().Show();
        };


    protected Dialog OnCreateDialog()
    {
            return new TimePickerDialog(this, TimePickerCallback, hour, minute, false);
    }

    private void TimePickerCallback(object sender, TimePickerDialog.TimeSetEventArgs e)
    {
        hour = e.HourOfDay;
        minute = e.Minute;
        UpdateTime();
    }

    private void UpdateTime()
    {
        if (SelectStartOrEndTime == true)
        {
            StartTimeTV.Text = string.Format("{0}:{1}", hour, minute.ToString().PadLeft(2, '0'));
        }
        else
        {
            EndTimeTV.Text = string.Format("{0}:{1}", hour, minute.ToString().PadLeft(2, '0'));
        }

    }