不能对承诺式任务调用 Start。异常即将到来

2023-11-29

我正在创建一个简单的 wpf 桌面应用程序。 UI 只有一个按钮和 .cs 文件中的代码,例如。

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    FunctionA();
}

public void FunctionA()
{
    Task.Delay(5000).Start();
    MessageBox.Show("Waiting Complete");
}

但出人意料的线路Task.Delay(5000).Start();正在扔一个InvalidOperationException:

不能对承诺式任务调用 Start。

任何人都可以帮助为什么会这样吗?


您收到该错误是因为Task在把任务交给你之前,班级已经开始了任务。你应该只打电话Start在通过调用其构造函数创建的任务上,您甚至不应该这样做,除非您有令人信服的理由在创建任务时不启动该任务;如果你希望它立即开始你应该使用Task.Run or Task.Factory.StartNew创建并开始一个新的Task.

所以,现在我们知道要摆脱那个讨厌的东西Start。您将运行代码并发现消息框立即显示,而不是 5 秒后显示,这是怎么回事?

Well, Task.Delay只是给你一个5秒内完成的任务。它不会停止线程的执行 5 秒。您想要做的是在该任务完成后执行一些代码。就是这样ContinueWith是为了.它允许您在给定任务完成后运行一些代码:

public void FunctionA()
{
    Task.Delay(5000)
    .ContinueWith(t => 
    {
        MessageBox.Show("Waiting Complete");
    });
}

这将按预期运行。

我们还可以利用 C# 5.0await关键字可以更轻松地添加延续:

public async Task FunctionA()
{
    await Task.Delay(5000);
    MessageBox.Show("Waiting Complete");
}

虽然对这里发生的事情的完整解释超出了这个问题的范围,但最终结果是一种行为与之前的方法非常相似的方法;调用该方法 5 秒后,它将显示一个消息框,但在这两种情况下,该方法本身将[几乎]立即返回。也就是说,await非常强大,允许我们编写看起来简单明了的方法,但使用它来编写会更加困难和混乱ContinueWith直接地。它还极大地简化了错误处理,删除了大量样板代码。

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

不能对承诺式任务调用 Start。异常即将到来 的相关文章

随机推荐

  • MySQL 查询优化 - JOIN?

    适合所有 MySQL 专家的一款 我有以下查询 SELECT o p name p amount p quantity FROM orders o products p WHERE o id p order id AND o total 0
  • C中int指针的初始化

    关于在 C 中初始化 int 指针的一个非常简单的问题 我是刚刚通知那 int varname 0 无效 我还没有找到指出这一点的明确参考 但有信心 基于评论者代表 它可能无效 即使它可以编译 构建和接受来自 calloc malloc 语
  • Maven + Surefire 在测试失败时返回代码为 0

    我有一个项目 测试分为单元阶段和集成阶段 我让它运行 buildbot 问题是即使在测试失败时 maven 返回代码也是 0 所以 buildbot 构建是成功的 这是 mvn 集成测试的结果 Results Tests in error
  • 将自定义 UIButton 添加到 UIKeyboard 的 UIWebView 附件视图

    我需要添加一个相机按钮UIWebView的键盘附件视图工具栏 已经具有 后退 下一步 和 完成 按钮的工具栏 是否有捷径可寻 我仍在寻找更好的方法来做到这一点 但目前的一个解决方案是销毁该栏并重新创建它 如下所示 void viewDidL
  • 应用程序脚本 - function () { [本机代码] }

    我正在制作一个谷歌应用程序脚本 我正在尝试制作一个可以读取第一个 callendar 事件的程序 问题是 当我尝试从中获取任何内容时 它只会写 function 本机代码 我看过一些为 javascript 编写的问题 但我不明白如何将 j
  • 如何触摸画布?

    这里是颤振新手 我目前正在尝试使用 Flutter 构建一个简单的触摸绘图应用程序 但无法弄清楚如何触发画布重新绘制 我所拥有的是这样的 我有一个 CustomPaint 小部件 其中包含一个 GestureDetector 子部件 每当发
  • 标准流的输入流/输出流 - Java

    我的理解是 字符流和字节流在C内部工作FILE stream C世界中的标准流是FILE stdin FILE stdout FILE stderr 输入流 and 输出流正在为文件 管道等资源提供子类 输入流 and 输出流api文档不讲
  • C++ 中的返回类型

    include
  • 不使用 intdiv() 的大数整数(64 位)除法(php7 之前)

    测试是在64位系统下进行的 php7有一个很好的功能 intdiv 下面的代码可以完美运行 number 0x7fffffffffffffff result intdiv number 62 结果是148764065110560900 其余
  • Java 8 SSLContext.getInstance("TLSv1.2") 是什么意思?

    我正在尝试为某个端点 URL 调用 REST API 它对于 java net 的 URL 运行良好 并且在执行相同的操作后 但在某些机器上 它因某些 SSLException 而失败 因此代码被修改如下 HttpsURLConnectio
  • Azure 共享访问签名 - 签名不匹配

    我收到此错误
  • 绘制重叠柱形图或条形图

    我需要使用柱形或条形类型将 4 个系列数据绘制到 MSChart 我可以绘制这 4 个系列 以便数据重叠而不是堆叠 我刚刚发现有一个ChartGroup OverlapOffice Excel 的属性 我该如何在 MSChart 中做到这一
  • Java:如何控制JPanel的宽高比?

    我有一个 JPanel 我想保持正方形 但我希望它的大小能够填充其父 JFrame 中可能的最大空间量 但保持正方形 即它采用 JFrame 的最短边作为正方形宽度 我搜索过网络 检查了所有布局管理器 似乎没有一个可以简单地解决这个非常简单
  • 需要更新SQLite中某列的值

    我需要对列中所有行的列值求反 我尝试使用以下查询来执行此操作 但它没有更新任何行 sqliteDatabase rawQuery UPDATE SQL TABLE NAME SET COL 1 COL 1 null 其中COL 1 col
  • 条件 WHERE 语句 SQL Server

    我想创建一个 SP 来返回所有Country行 除非CountryID作为参数提供 这是我想象的它可能的工作方式 但它不喜欢它 ALTER PROCEDURE dbo usp return countries CountryID AS IN
  • HTML5 将加密的视频帧绘制到画布(带有clearkey的加密媒体扩展)

    我正在尝试使用 Javascript 将 HTML5 视频元素中的帧绘制到画布 其中视频 webm VP9 已使用 Clearkey 加密 我正在使用 EME 在 Chrome 中解密它 使用 EME 加密媒体扩展 时 Chrome gt
  • 检测我何时在页面顶部滚动 UIWebView

    我想在我的 webview 顶部添加一个 URL google 栏 并像 Safari 一样通过向上滚动我的网页来访问它 为此 我将检测用户何时滚动页面 以及何时滚动到达顶部 但我实在不知道怎么办 一个主意 非常感谢 Martin 我也在挖
  • 如何在 Perl 中解析 XML 并创建树结构

    我正在解析 XML 文件XML Simple 有没有办法从 XML 中获取树形形式 如果是这样 请举例说明或建议 CPAN 包 我想知道之后我必须处理哪个标签column等等 标签没有顺序 这column标签可以出现在Table or di
  • 用于检索各种日期范围内的 SUM 的 SQL 查询

    我有一个表格 其中包含有关已售产品 客户 购买日期和已售单位摘要的信息 我想要得到的结果应该是 4 行 其中前三行是一月 二月和三月 最后一行是这 3 个月内未售出的产品 这是桌子 http imageshack us a img823 8
  • 不能对承诺式任务调用 Start。异常即将到来

    我正在创建一个简单的 wpf 桌面应用程序 UI 只有一个按钮和 cs 文件中的代码 例如 private void Button Click 2 object sender RoutedEventArgs e FunctionA publ