我正在使用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;
}
}
感谢您的帮助。
答案 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);
}