是否可以等待 Device.BeginInvokeOnMainThread 代码完成(继续使用 UI 调用的结果进行后台工作)

2024-01-10

在我的代码中,我有一个名为“ShowMessageBoxAsync”的任务。我想使用此代码向用户显示(并等待) DisplayAlert 并返回结果。像这样: var messageBoxResult = wait View.ShowMessageBoxAsync("这是一个错误");

显示消息框异步的代码是:

public async System.Threading.Tasks.Task<bool> ShowMessageBoxAsync(string message)
{
    var result = false;
    Device.BeginInvokeOnMainThread(async () =>
    {
        result = await DisplayAlert("Error", message, "OK", "Cancel");
    });
    return result;
}

在添加 Device.BeginInvokeOnMainThread 之前,该任务给了我一个异常,它没有在主/UI 线程上运行。所以添加BeginInvokeOnMainThread后,就开始工作了,没有异常。但问题是,代码直接转到结果,而不等待“await DisplayAlert”的结果。

是否可以仅在 Device.BeginInvokeOnMainThread 代码完成后返回“result”值?

我对此做了一些研究,有人建议使用 TaskCompletionSource,但这会阻塞 UI 线程,并且 DisplayAlert 根本不会显示。


我对此做了一些研究,有人建议使用 TaskCompletionSource

这是正确的解决方案。TaskCompletionSource充当“完成者”Task。在这种情况下,这个Task代表用户交互,因此您希望 UI 线程上的代码完成Task,以及后台线程上的代码(a)等待`Task.

所以,像这样:

public Task<bool> ShowMessageBoxAsync(string message)
{
  var tcs = new TaskCompletionSource<bool>();
  Device.BeginInvokeOnMainThread(async () =>
  {
    try
    {
      var result = await DisplayAlert("Error", message, "OK", "Cancel");
      tcs.TrySetResult(result);
    }
    catch (Exception ex)
    {
      tcs.TrySetException(ex);
    }
  });
  return tcs.Task;
}

这应该可以让你暂时解除封锁。然而,更好的长期解决方案是让后台线程逻辑采用某种“与 UI 交互”界面,如下所示:

public interface IAskUser
{
  Task<bool> AskUserAsync(string message);
}

具有与上面类似的 Xamarin-Forms 特定实现。

这样,您的后台线程逻辑就不会与特定的 UI 绑定,并且可以更轻松地进行单元测试和重用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以等待 Device.BeginInvokeOnMainThread 代码完成(继续使用 UI 调用的结果进行后台工作) 的相关文章

  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • Keras 功能模型提供高验证精度但预测不正确

    我正在尝试使用 PASCAL VOC 2012 数据集上的 ImageNet 预训练权重对 VGG16 架构进行迁移学习 PASCAL VOC 是一个具有 20 个类别的多标签图像数据集 因此我修改了内置的 VGG16 模型 如下所示 de
  • 一个简单的可重现示例,用于在 R 中的自定义函数中将参数传递给 data.table

    我已经用谷歌搜索这个答案几个小时了 很多人都问过类似的问题 但我没有找到足够简单的问题或直接的答案 这是我的方法 假设我想做一个简单的分组data table library data table mtcars data table mtc
  • Java:给定日期的迭代

    我在 Java 中有两个日期 Wed Jan 05 00 00 00 CET 2011 Sat Jan 15 23 59 59 CET 2011 现在我想迭代它们 这样我每天都可以做一个System out println 我在控制台上输入
  • 没有负值的 JSpinner

    我正在 Netbeans 中构建一个小型应用程序 我使用 JSpinner 组件来设置产品的数量 如何将微调器设置为仅取正值 Netbeans 内是否有我可以设置的选择或方法JSpinner EXTRA spinner setModel n
  • 如何在不再次拉取子存储库的情况下进行本地克隆?

    我经常使用 Mercurial 在本地存储我的上游克隆 然后在本地再次克隆以适应我的实际工作环境 cd clones hg clone ssh external repo example com some repo path foo cd
  • 无法在初始渲染中找到参考

    我刚刚在官方文档中读到 第一次渲染时没有调用 componentDidUpdate 我想这可能就是为什么我的这个组件第一次渲染时 dom 没有被定义 这是一个弹出模式 当需要编辑页面时会弹出 我还有其他方法可以解决这个问题吗 compone
  • 将文件移动到新目录的批处理命令

    我想编写一个批处理作业 执行时将抓取所有文件C Test Log文件夹并将它们移至新目录C Test 这个新目录的名称为 Backup 名称为 当前日期 因此 完成后 日志文件夹应该为空 所有文件现在都位于新文件夹中 我知道我必须使用MOV
  • Java:如何获取当前音频输入的频率?

    我想分析麦克风输入的当前频率 以使 LED 与播放的音乐同步 我知道如何从麦克风捕获声音 但我不知道 FFT 这是我在寻找获取频率的解决方案时经常看到的 我想测试一下某个频率的当前音量是否大于设定值 代码应该看起来像这样 if freque
  • 自动扩展 YAML 合并的工具?

    我正在寻找一种工具或流程 可以轻松获取包含锚点 别名和合并键的 YAML 文件 并扩展别名并合并到平面 YAML 文件中 仍有许多常用的 YAML 解析不完全支持合并 我希望能够利用合并来保持干燥 但在某些情况下 需要将其构建到更详细的 平
  • 破损的日食可以修复吗?

    几天后 我不能再使用 Ctrl S 等键盘快捷键 因为它会在我的源代码中插入特殊字符 在属性文件中 我注意到 Ctrl S 插入了 u2308 有没有办法修复此问题 而无需重新安装 STS 2 8 1 您可以尝试使用以下命令从命令行启动 E
  • 如何使用授权和客户端 ID 在 C# 中调用 Azure Maps API?

    我正在尝试使用Azure 地图 API使用坐标搜索某个点周围的 POI 但我不知道如何通过添加以下内容来调用 API授权 and 客户端 ID 这是我在 Microsoft 文档网站上尝试该 API 时收到的请求预览 GET https a
  • 续集“findbyid”不是一个函数,但显然“findAll”是

    我遇到了一个非常奇怪的问题 当我尝试调用函数 findAll 时 它工作正常 创建和销毁相同 但是当我尝试调用函数 findById 时 它会抛出 findById 不是函数 与 FindOne 相同 works fine var gamm
  • model.save_weights 是否包含优化器状态?

    如果是 那么他们是如何做到的 我的意思是 假设我有一个通过子类化定制的模型 我的优化器是一个单独的对象 一个命令如何保存两个不同物体的权重 特别是 它如何知道这两个对象是相关的 是由于 model compile 完成的魔法吗 编辑 我刚刚
  • Laravel 图像提交按钮

    我想知道是否有一种方法可以自定义提交按钮的外观 改为图像 拉拉维尔 3 http three laravel com docs 目前 我的提交按钮代码如下所示 Form open project delete DELETE Form hid
  • 在逻辑或可视树中查找工具提示弹出窗口

    说我有一个ToolTip使用 XAML 中指定的样式 如下所示
  • 使用 as.numeric(levels(f))[f] 将数据框中的因子子集转换为数字

    我有一个包含 100 个变量的数据框 我想要将其中的一个子集 例如 dataframename 30 50 转换为它们的原始数值 1 2 3 4 5 我知道我应该使用as numeric levels f f 当我转换一个因子时 但只有当我
  • 如何将一个目录中的所有文件重定向到另一个目录?

    我已将服务器上的文件移至新目录 并希望将所有请求 301 重定向到新目录中的文件 假设我有 域名 com test apples php 域名 com test oranges php 域名 com test bananas php 我如何
  • JavaScript setTimeout 如此不准确的原因是什么?

    我在这里得到了这段代码 var date new Date setTimeout function e var currentDate new Date if currentDate date gt 1000 console log cur
  • C 文件编程 - 使用 POSIX 调用替换文件中的文本

    有没有办法使用 POSIX 调用替换文本文件中的任何关键字 而无需重新创建文件 如果是的话请告诉我该怎么做 提前致谢 如果文本和替换的大小相同 则可以使用模式打开它r 查找 然后写入 如果它们的大小不同 则无法在不重新创建的情况下进行替换
  • 是否可以等待 Device.BeginInvokeOnMainThread 代码完成(继续使用 UI 调用的结果进行后台工作)

    在我的代码中 我有一个名为 ShowMessageBoxAsync 的任务 我想使用此代码向用户显示 并等待 DisplayAlert 并返回结果 像这样 var messageBoxResult wait View ShowMessage