【问题标题】:How to wait background task in Xamarin?如何在 Xamarin 中等待后台任务?
【发布时间】:2021-04-09 17:01:36
【问题描述】:

我正在尝试使用 Xamarin 的文件选择器从设备中获取文件,并对该文件执行一些操作。但是,由于我尝试执行的操作很繁重,文件选择器会冻结并等待任务完成。因此,我无法通知用户该任务,它只是冻结。只是我试图在后台运行此操作,例如:

  1. 选择文件
  2. 等待文件选择器屏幕关闭
  3. 通知用户该任务。
  4. 对文件进行操作。 我尝试使用“等待”来实现这一点,但没有成功。

编辑:我正在尝试在后台执行操作而不会导致 UI 冻结。

这是我的代码

foreach (var file in pickResult)
                {
                    await Task.Run(async () =>
                   {
                       MainThread.BeginInvokeOnMainThread(() =>
                       {
                           doSomethingWith(file.FullPath);
                       }
                       );
                   });
                }

如果您能分享您实现这一目标的想法,我会很高兴。

【问题讨论】:

  • BeginInvokeOnMainThread 中运行的任何东西都明确不是后台任务

标签: multithreading xamarin asynchronous background task


【解决方案1】:

试试这样的

var tasks = new List<Task>();
foreach (var file in pickResult)
{
  tasks.Add(Task.Run(()=>doSomethingWith(file.FullPath)));
}
await Task.WhenAll(tasks);
//all done, you can update UI to indicate this.

这里我们为每个文件启动任务,然后在for循环之后我们异步等待所有任务完成。然后我们可以更新 UI 或其他东西。

【讨论】:

  • 这对我来说适用于大尺寸的文件,谢谢。但是这一次,当我尝试添加大约 6-8 个以上的文件时,它会抛出这个异常::'Index must be in the bounds of the List.参数名称:index'
  • 你从哪里得到这样的异常?在哪一行代码?尝试用虚拟存根替换你的 doSomethingWith() 并再次检查 - 你还会得到异常吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多