如何正确等待不可等待的操作完成

2023-12-05

在我的应用程序中,我创建了一个 SerializedBitmapImage 类,它在从互联网下载另一个图像时显示默认图像。它还允许将下载的图像序列化为字节数组,因此不需要在每次应用程序启动时下载图像。 我目前在“Card”类中有一个 SerializedBitmapImage ,它在卡数据下载完成时立即保存:

var resp = await AppData.API.GetCards();
if (resp != null)
{
    if (AppData.CardsData == null)
        AppData.CardsData = new CardsData();
    AppData.CardsData.Update(resp);
    AppData.SaveCards();
    FillCards();
}

但是,有时在调用 AppData.SaveCards() 时 SerializedBitmapImage 中的图像尚未完成下载,导致图像无法保存。 因此,我正在寻找一种延迟保存直到下载图像的方法。现在,我正在 SerializedBitmapImage 的构造函数中下载图像,如下所示:

Image = new BitmapImage(defaultUri); //set to default while downloading
BitmapImage img = new BitmapImage { CreateOptions = BitmapCreateOptions.None };
img.ImageOpened += (sender, e) => //download successful, set Image to downloaded image
{
    Image = sender as BitmapImage;
    NotifyPropertyChanged("Image");
};
img.UriSource = downloadUri; //download the image

我在 Serialized BitmapImage 中创建了一个任务来等待图像完成,但我不确定它是否以健康的方式完成其工作。

public async Task WaitForImageDownload()
{
    while (Image == null || Image.UriSource.OriginalString == "Assets/MainPage/DefaultCard.png")
        await Task.Delay(100); //check again if completed in 100ms
}

然后,在 AppData.SaveCards() 中,我等待所有图像下载完毕,然后再保存卡片:

Task[] tasks = new Task[CardsData.Count];
for (int i = 0; i < CardsData.Count; i++)
    tasks[i] = CardsData[i].CardImage.WaitForImageDownload();
await Task.WhenAll(tasks);

这是等待无法等待完成的操作的正确方法吗?或者,有没有办法强制立即下载图像? 感谢您的帮助! 埃利奥特


你很接近了。当然,每次你忙着等待时,警钟都应该响起:

while (Image == null || Image.UriSource.OriginalString == "Assets/MainPage/DefaultCard.png")
    await Task.Delay(100); //check again if completed in 100ms

那并不完美。这会起作用,但您会不必要地加速 CPU,并且会引入用户可能会感觉到的延迟。最好只唤醒一个您正在等待的条件成立的情况。让图像通知您:

public async Task WaitForImageDownload()
{
    var tcs = new TaskCompletionSource<bool>();

    image.ImageOpened += (o, e) =>;
    {
        tcs.SetResult(true);
    };

    image.ImageFailed += (o, e) =>;
    {
        tcs.SetResult(false);
    };

    //set the source after the events have been attached
    //or, check whether the image has been loaded already and only
    //attach if it has
    image.SetSource(TODO); 

    await tcs.Task;

}

(最好将等待转移到辅助方法中。)

您的使用情况Task.WhenAll是一件好事。

或者,有没有办法强制立即下载图像?

从字面上回答这个问题:当然不是,那违反了物理学。 (我不知道你问这个问题是什么意思......)

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

如何正确等待不可等待的操作完成 的相关文章

  • 为什么 ASP.Net MVC Range 属性采用类型?

    我只是想知道为什么范围验证属性可以采用类型和两个字符串作为参数 这是为了根据枚举或类似的东西验证字符串吗 另外 我想做的是找到一种简单的方法来验证必须出现在枚举中的 3 个字符的字符串 有什么建议吗 谢谢 亚历克斯 我确实发现你提到的 Ra
  • 没有类型的 IEnumerable 属性

    我正在尝试创建一个类似于来自 MSDN 的官方 DataGrid ItemsSource 的属性 public IEnumerable ItemsSource get set 这提供了对任何派生类中任何类型的支持 有了这个 我可以设置类似的
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不
  • 如何为子控制台应用程序使用单独的控制台窗口?

    Windows 10 C NET Core 3 1 我想要多个控制台窗口用于输出 例如 在一个显示器上 我想放置一个控制台窗口 它将仅显示错误输出 在另一个显示器上 我想放置一组其他控制台窗口 它将显示各种报告 所有这些控制台窗口都是只读的
  • 上传并 POST 文件到 PHP 页面

    我需要一种上传文件并将其 POST 到 php 页面的方法 php 位于 apache 服务器上 我在我的桌面应用程序中使用这个 C 代码 这是一个c代码的套接字 当我执行程序时 可以得到 文件大小为772906 打开服务器正常 文件大小为
  • PointToScreen 多个显示器

    我正在使用 PointToScreen 来确定弹出窗口的位置 以便它位于用于弹出窗口的按钮旁边 但是 该按钮位于工具栏上 因此用户可以移动弹出窗口 弹出窗口的位置效果很好 但如果用户位于象限上 我想将弹出窗口移动到底部上方 而不是下方 或左
  • 我的代码将对象设置为错误的父对象,如何修复此问题?

    因此 我目前正在为一篇学校论文进行编程 当前我的代码工作计划 或者至少我认为应该是 在使用碰撞作为拖放条件下 将对象设置为指定父级的子级 使用 if 条件的传感器 然而 当我运行游戏时 我小时候想要设置的对象被错误的父母使用 这基本上就是发
  • C++ Protobuf 与 JSON 的转换 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人熟悉将 protobuf 消息与 JSON 相互转换的稳定 C 解决方案 库 代码片段等 吗 在我看来 这个更好 https gith
  • 如何使用 IComparable 接口?

    我需要一个如何使用的基本示例IComparable接口 以便我可以按升序或降序以及要排序的对象类型的不同字段进行排序 好吧 既然你正在使用List
  • 如何使用 AutofacContrib.NSubstitute 监视被测类

    我正在使用 NSpec 框架 AutofacContrib NSubstitute v3 3 2 0 NSubstitute v1 7 0 0 目前最新的是 1 8 2 的类库项目中运行单元测试 The 被测类实例是用AutoSubstit
  • ASP.NET MVC:使用 SendAsync (System.Net.Mail) 发送电子邮件

    有什么办法吗in MVC让 System Net Mail SendAsync 工作 而不是阻止 Send 方法 我尝试使用它 但遇到了 启动异步操作的页面必须具有异步属性 错误 我显然无法解决该问题 或者可以吗 因为没有带有 Page 指
  • 无需 Excel 和 OLEDB 即可读取 .xlsx

    是否有机会在 C 中读取 xlsx 文件 而无需在客户端上安装 Excel 并且没有可用的 OLEDB 连接 该应用程序是一个用 VS2005 C NET Framework 2 0 编写的 Winforms 项目 这里的这个怎么样 EPP
  • GSL 中的错误 - 根查找

    大家好 我在让我的程序与 GSL 根查找一起工作时遇到问题 我正在尝试找到我的方程的解 我正在寻找 64 行数据的解决方案 但在某些特定行中 程序无法继续 可能是因为不存在好的解决方案 但我希望程序在找不到解决方案时跳过行 但我的程序有时会
  • 如何用C++读取UTF-8文件数据?

    我有一个清单IPA https en wikipedia org wiki International Phonetic Alphabet名为 ipa txt 的文本文件中的 UTF 8 符号并为其分配了数字 如何将它与源文件交叉引用 该源
  • TextBlock 中的 C# 超链接:单击它时没有任何反应

    在我的 C 独立应用程序中 我想让用户单击一个链接来启动他们最喜欢的浏览器 System Windows Controls TextBlock text new TextBlock Run run new Run Link Text Hyp
  • 如何在 C# 中创建唯一的随机字符序列?

    我正在我的应用程序中实现 URL 缩短功能 以便为我的用户提供可在 Twitter 中使用的更短的替代 URL 关键是要独立于提供相同服务的缩短服务 并将其作为我的网络应用程序的一项功能 创建约 6 个字符的独特随机字符序列的最佳方法是什么
  • 如何将字节数组转换为流[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中将 byte 转换为流 https stackoverflow com questions 4736155 how do i convert byte to stream in c 我需

随机推荐

  • 为什么我的 Lambda 无法访问互联网?

    我有一个 Lambda 函数 可以从 API 网关或 ALB 请求触发 我还有一个 RDS Aurora PostgreSQL 实例 它们都在 VPC 中运行 我可以从 Lambda 很好地连接到 RDS 实例 但是我无法访问互联网 例如试
  • 在新线程上运行Python程序

    我有两个程序 program1 py 就像命令行界面 它接受用户的命令 program2 py 具有根据命令运行相关程序的程序 程序 1 还有一个 quit program 模块 在我们简单的宇宙中 假设我只有一个命令和一个程序 那么我们可
  • 如何将 UIActivityIndi​​catorView 放入 UIAlertController 中?

    我们正在放弃 MBProgressHUD 因为它在我们的应用程序中故障太多 并且没有阻止用户输入或提供 取消 按钮等功能 所以 我尝试实施滑动瞄准器如何在 UIAlertController 的中心显示活动指示器 我遇到了指标定位不当的情况
  • ng-repeat 和 ui-if

    当我想将 ui if anguluarUi 与 ng repeat 一起使用时 我认为它在那里最有用 我收到错误 Error Multiple directives uiIf ngRepeat asking for transclusion
  • Firebase HTTP 函数 CORS

    使用 Firebase HTTP 函数时 我仍然遇到 CORS 问题 这是我的网络控制台错误 Response to preflight request doesn t pass access control check No Access
  • 将图像的左侧拉伸到容器外到页面边缘

    通常我很擅长 CSS 但我不知道如何进行这个特定的布局 我有一个最大宽度为 1 400 像素的容器 左边距和右边距设置为auto因此 当视口高于 1 400 像素时 容器会居中 然后 我在容器外部有一个图像 旁边有一个 div 图像占据了视
  • 获取所选元素的位置,而不是 DOM 中元素的索引

    div h3 Heading one h3 h3 Heading two h3 h4 heading caption h4 h3 Heading three h3 div 我想获取 jQuery 选择中元素的位置 而不是它在 DOM 中的索
  • 如果表单字段为空,则阻止使用 ajax 提交表单

    我在简单的表格上遇到了一些麻烦 如果字段为空 我似乎无法阻止表单提交 有没有一种简单的方法来检查字段是否为空 然后阻止表单提交 这是我的 html 表单
  • 将 WordPress 身份验证与现有用户数据库集成

    我有一个包含用户表的数据库 其中包含以下字段 id name email password status 我的用户通过提供电子邮件和密码登录 我安装了一个博客 其路径为 mysite com news 我想要的是 如果某个用户在我的网站上注
  • 尝试获取 iPhone 屏幕尺寸时的 EXC_BAD_ACCESS

    当界面方向发生变化时 我试图使某些元素根据屏幕尺寸调整大小 我在不同的地方 包括这里的一些答案 读到 获取屏幕边界的方法是使用 UIScreen mainScreen bounds 所以我添加了这段代码来看看它的行为方式 void will
  • 将特殊字符转换为常规 C#

    C 中是否有命令可以转换字符串 例如 https 3A 2F 2Fwww google com回到https www google com 也许某种 解密 方法 你需要使用System Web HttpUtility UrlDecode为了
  • 如何从 ImageView 将图像设置为壁纸?

    我有一个活动 其中有两个按钮和一个 ImageView 一个按钮是从手机的相机应用程序中获取图像并将其设置到 ImageView 另一个按钮是将该图像设置为主屏幕壁纸 所以我想要代码如何将该图像从 ImageView 设置到壁纸 Step
  • 如何使字符串比较不区分大小写?

    我正在尝试为其中一个根据您的答案做出响应的程序编写代码 我想让一些变量不区分大小写 例如如果我的变量x等于 Me 我希望它也等于 me 那可能吗 到目前为止 这是我的代码 import java util Scanner class Tut
  • 注册自动登录禁用

    我在我的项目中使用 keycloak 4 8 3 Final 我需要在注册后禁用自动登录 我已经阅读 keycloak 文档 5 天了 找不到答案 不知道是否可行 任何指南都会对我有用 谢谢 如果注册后想再次显示Keycloak登录表单 可
  • 使用按钮调整简单的表单字段值

    首先 我对反应管理非常陌生 我有一个 SimpleForm 它通过 API 调用填充一堆字段
  • 在 WooCommerce Checkout 中为特定类别启用百分比折扣的复选框

    以下修改后的代码基于添加一个结账复选框字段 在 Woocommerce 中启用百分比费用 我已经进行了调整 但希望只针对特定类别 因此当学生在结账时勾选方框并定义他们是学生时 系统会扣除总金额的 15 但仅限于特定类别范围 即 在线研讨会
  • 如何测量管道系统调用时间(以毫秒为单位)?

    我想查看我的管道程序系统调用的时间 我需要测量它来分析结果 如何测量系统调用的时间 以毫秒为单位 例如 这是简单的管道程序 include
  • 如何让 Watson 捕获数字序列 (input.text.extract)

    在我的示例中 我要求提供个人文档编号 该编号有 11 位数字 并且我需要 如果用户正确输入 11 个数字 watson 就会继续对话 如果没有 watson 将通知由我 这个怎么做 我的情况 沃森 说 好的 我会检查一下 您的协议号是多少
  • Microsoft.VisualStudio..Default.props”未找到

    我一直在四处寻找 但我得到的是类似的东西 The imported project C Microsoft Cpp Default props was not found instead of C Program Files x86 MSB
  • 如何正确等待不可等待的操作完成

    在我的应用程序中 我创建了一个 SerializedBitmapImage 类 它在从互联网下载另一个图像时显示默认图像 它还允许将下载的图像序列化为字节数组 因此不需要在每次应用程序启动时下载图像 我目前在 Card 类中有一个 Seri