【问题标题】:System.AggregateException: One or more errors ocurred. (A task was canceled.)System.AggregateException:发生一个或多个错误。 (一个任务被取消了。)
【发布时间】:2023-04-06 15:13:01
【问题描述】:

我正在尝试调用 LoadPickerData 方法,以使用 ViewModel 中的 async/await 将结果加载到 Picker 中。我收到以下错误:

错误

System.AggregateException
  Message=One or more errors occurred. (A task was canceled.)
  Source=mscorlib
  StackTrace:
  at System.Threading.Tasks.Task.ThrowIfExceptional (System.Boolean includeTaskCanceledExceptions) [0x00011] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs:2027 
  at System.Threading.Tasks.Task`1[TResult].GetResultCore (System.Boolean waitCompletionNotification) [0x0002b] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Future.cs:496 
  at System.Threading.Tasks.Task`1[TResult].get_Result () [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Future.cs:466 
  at EmployeeApp.Helpers.ConnectivityHelper.CheckConnectivity () [0x00049] in F:\Workspace\BajaDev\MPA\_Project\EmployeeApp\Helpers\ConnectivityHelper.cs:34 
  at EmployeeApp.Helpers.ConnectivityHelper.get_IsConnected () [0x00000] in F:\Workspace\BajaDev\MPA\_Project\EmployeeApp\Helpers\ConnectivityHelper.cs:21 
  at EmployeeApp.ViewModels.BaseViewModel.get_ServiceAreaStore () [0x00000] in F:\Workspace\BajaDev\MPA\_Project\EmployeeApp\ViewModels\BaseViewModel.cs:27 
  at EmployeeApp.ViewModels.MailboxViewModel.GetPickerServiceArea () [0x0000f] in F:\Workspace\BajaDev\MPA\_Project\EmployeeApp\ViewModels\MailboxViewModel.cs:60 
  at EmployeeApp.MailboxPage.LoadPickerData () [0x0002b] in F:\Workspace\BajaDev\MPA\_Project\EmployeeApp\Views\MailBoxPage.xaml.cs:70 
  at EmployeeApp.MailboxPage.OnAppearing () [0x0002c] in F:\Workspace\BajaDev\MPA\_Project\EmployeeApp\Views\MailBoxPage.xaml.cs:31 
  at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__7_0 (System.Object state) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1021 
  at Android.App.SyncContext+<>c__DisplayClass2_0.<Post>b__0 () [0x00000] in <06692e0cad5848598a0f46942a89e99f>:0 
  at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <06692e0cad5848598a0f46942a89e99f>:0 
  at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] in <06692e0cad5848598a0f46942a89e99f>:0 
  at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.44(intptr,intptr)

我正在尝试在选择器中加载 GET 请求的结果,但是当我第一次启动应用程序时,它没有,我得到了上一个异常,第二次运行它时我不再得到那个错误。 我寻找原因,我在构造函数中调用异步方法,这是错误的代码,我将其更改为 OnAppearing () 方法,但仍然出现异常,我不知道为什么

MailboxPage.xaml.cs

public MailboxPage()
    {
        InitializeComponent();

        BindingContext = viewModel = new MailboxViewModel();
    }

    protected override async void OnAppearing()
    {
        base.OnAppearing();
        await LoadPickerData();
    }

private async Task<IEnumerable<ServiceArea>> LoadPickerData()
    {
        var vm = new MailboxViewModel();

        var servicesareas = await vm.GetPickerServiceArea();
        try
        {
            ServiceAreaPicker.ItemsSource = servicesareas.ToList();
            ServiceAreaPicker.ItemDisplayBinding = new Binding("Name");
        }
        catch(AggregateException ae)
        {
            foreach (var e in ae.Flatten().InnerExceptions)
            {
                Debug.WriteLine($"{e.GetType().FullName} { e.Message}");
            }
        }

        return servicesareas;
    }

MailboxViewModel.cs

public async Task<IEnumerable<ServiceArea>> GetPickerServiceArea()
    {
        try
        {
            PickerItems = await ServiceAreaStore.GetPickerItemsAsync(true);
            foreach (var item in PickerItems)
                Items.Add(item);
        }
        catch (AggregateException ae)
        {
            foreach (var e in ae.Flatten().InnerExceptions)
            {
                Debug.WriteLine($"{e.GetType().FullName} { e.Message}");
            }
        }

        return PickerItems;
    }

ServiceAreaStoreAPI.cs

public async Task<IEnumerable<ServiceArea>> GetPickerItemsAsync(bool forceRefresh = false)
    {
        if (forceRefresh)
        {
            var json = await Client.GetStringAsync($"api/servicearea");
            Servicesareas = await Task.Run(() => JsonConvert.DeserializeObject<IEnumerable<ServiceArea>>(json));
            try
            {
                var success = LocalDatabase.AddItemsAsync(Servicesareas);
                if (!success.Result)
                {
                    //Log de fallo en la insercion de datos.
                }
            }
            catch(AggregateException ae)
            {
               foreach (var e in ae.Flatten().InnerExceptions)
               {
                  Debug.WriteLine($"{e.GetType().FullName} { e.Message}");
               }
            }
        }
        return Servicesareas;
    }

【问题讨论】:

  • 我们能看到EmployeeApp.Helpers.ConnectivityHelper.CheckConnectivity方法的代码吗?看起来错误正在该文件的第 34 行引发:EmployeeApp.Helpers.ConnectivityHelper.CheckConnectivity () [0x00049] in F:\Workspace\BajaDev\MPA\_Project\EmployeeApp\Helpers\ConnectivityHelper.cs:34
  • @Andrew 当然可以,但这只是一种状态
  • @Andrew 你能看到吗?
  • @Andrew 第 34 行:var json = client.GetStringAsync($"api/status").Result;

标签: c# xamarin xamarin.forms xamarin.android task


【解决方案1】:

在您的 ServiceAreaStoreAPI 中,您不会等待可能导致您的问题的任务,因为它会继续执行并返回取消的结果。

var success = LocalDatabase.AddItemsAsync(Servicesareas);

【讨论】:

    【解决方案2】:

    如果您在方法体中使用了 Task.Wait() 方法,那么在方法中添加 async 关键字将解决此问题。例如:

     public async Task<ActionResult> Delete(int id) { }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      相关资源
      最近更新 更多