【问题标题】:How to setup and call an Async method如何设置和调用异步方法
【发布时间】:2015-10-30 07:11:10
【问题描述】:

我正在使用 Mvvm Light 开发一个 xamarin android 应用程序,我有一个正在调用的方法,我想将其更改为异步方法,但我不确定如何。只是好奇如何做到这一点。它适用于 Visual Studio 中的 Xamarin Android 应用

调用方法:

    protected override void onResume()
    {
         ObservableCollection locObs = Vm.ShowLocations();
    }

方法:

    public ObservableCollection<Location> ShowLocations()
    {
        if (Debugger.IsAttached)
        {
            if (Locations != null)
            {
                var locationsCopy = Locations.ToList();
                Locations = new ObservableCollection<Location>(locationsCopy);
            }
            Election elec = IntentManager.Instance.CurrentElection;
            elec.Locations = new System.Collections.ObjectModel.ObservableCollection<Location>();
            Location loc = new Location();
            loc.Name = "Alan Middle School";
            loc.Address = "300 S. County Farm Road";
            elec.Locations.Add(loc);
            Location loc2 = new Location();
            loc2.Name = "Bill High School";
            loc2.Address = "100 S. County Farm Road";
            elec.Locations.Add(loc2);
            Location loc3 = new Location();
            loc3.Name = "Cameron Fire Station";
            elec.Locations.Add(loc3);
            Location loc4 = new Location();
            loc4.Name = "Danvill Senior Center";
            elec.Locations.Add(loc4);

            Locations = elec.Locations;
        }
        return Locations;
    }

【问题讨论】:

  • 该方法中没有异步调用。将其标记为异步不会做任何事情。
  • 在 Java 中你会使用AsyncTask。这是那个班级的Xamarin Documentation
  • 您不能只使方法异步。需要涉及一些固有的异步操作,这将受益于使用 async 关键字。
  • 这个方法只是分配了一堆静态数据。这里没有任何异步可供我们使用。要求我们帮助您将此方法设置为“异步”就像要求我们将此方法设置为“紫色”。感谢您尝试学习新东西,但这不是一个好的示例选择。
  • 如果您首先提到使用服务调用,或者在您的示例中对服务进行虚拟调用,那会使整个讨论变得容易得多。

标签: c# android xamarin async-await visual-studio-2015


【解决方案1】:

这将替换为服务调用。这是暂时的,我只是在询问有关 Async 的提示或示例。

一旦你有一个服务调用,你可以像这样使用await异步调用它:

var locations = await GetLocationsAsync();
elec.Locations = new ObservableCollection<Location>(locations);

这要求调用方法为async,如:

public async Task<ObservableCollection<Location>> ShowLocationsAsync()
{
  var locations = await GetLocationsAsync();
  elec.Locations = new ObservableCollection<Location>(locations);
  return elec.Locations;
}

然后可以称为:

protected override async void onResume()
{
  ObservableCollection locObs = await Vm.ShowLocationsAsync();
}

【讨论】:

  • 有趣。所以这个的主要部分是等待和校准方法必须是异步的。异步调用仍然在 ui 线程上运行,尽管是正确的(尽管是异步的)而不是 backgroundworker?
  • 难道不想从任务中的原始方法进行调用吗?
  • @HisnamewasRobertPaulson:在这个例子中,是的,所有代码都在 UI 线程上异步运行。不涉及其他线程。我不确定您所说的“从任务中拨打电话”是什么意思。
  • @Stephan Cleary - dotnetperls.com/async 这有一个创建任务然后从任务对象调用异步的示例。
  • @HisnamewasRobertPaulson:这个例子并不理想。它使用 Task 构造函数 Task.Startasync void,而这些都不是必需的。
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 2017-03-06
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
相关资源
最近更新 更多