Task.Run()之后Task.ContinueWith()不起作用

时间:2019-02-16 11:37:49

标签: c# xamarin

我正在使用xamarin的活性指标。 我想在产品拿到后停止指示器。

protected override void OnAppearing()
    {
        base.OnAppearing();

        if (!_appeared) // Avoid repeat loding
        {
            activity.IsEnabled = true;
            activity.IsRunning = true;
            activity.IsVisible = true;

            var task = Task.Run(() =>
            {
                ProductViewData productViewData = new ProductViewData();
                products = productViewData.GetProductList("10");
                count = 10;
                productListView.ItemsSource = products;
            });

            task.ContinueWith(t =>
            {
                activity.IsEnabled = false;
                activity.IsRunning = false;
                activity.IsVisible = false;
            });

            _appeared = true;
        }
    }

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

使用异步/等待,这样的代码要容易得多:

protected override async void OnAppearing()
{
    base.OnAppearing();

    if (!_appeared) // Avoid repeat loding
    {
        _appeared = true;
        activity.IsEnabled = true;
        activity.IsRunning = true;
        activity.IsVisible = true;

        var products = await Task.Run(() =>
        {
            ProductViewData productViewData = new ProductViewData();
            return productViewData.GetProductList("10");
        });

        productListView.ItemsSource = products;

        activity.IsEnabled = false;
        activity.IsRunning = false;
        activity.IsVisible = false;
    }
}

尽管代码简单易读,但幕后还有很多事情发生,尤其是此方法返回时,以及运行await之后代码在哪个线程上。值得一读。

答案 1 :(得分:1)

我想这就是您所需要的。

var task = Task.Run(delegate { Console.WriteLine("Task started!"); })
           .ContinueWith(delegate { Console.WriteLine("Task continued"); });

只需包装要用作函数的内容,然后在任务步骤中调用该函数即可。有关更多信息,请阅读here

编辑:

由于UI操作是此问题的主题,所以我认为链接的页面中的这段代码会更有用。该代码利用了UI和后台调度程序。

private void Button1_Click(object sender, EventArgs e)  
{  
   var backgroundScheduler = TaskScheduler.Default;  
   var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();  
   Task.Factory.StartNew(delegate { DoBackgroundComputation(); },  
                         backgroundScheduler).  
   ContinueWith(delegate { UpdateUI(); }, uiScheduler).  
                ContinueWith(delegate { DoAnotherBackgroundComputation(); },  
                             backgroundScheduler).  
                ContinueWith(delegate { UpdateUIAgain(); }, uiScheduler);  
}