如何从主窗口调用异步方法?

2023-12-30

所以我写了一个快速的async方法将一些数据放入DataTable来自 Oracle 数据库。我该怎么称呼这个MainWindow()不阻塞UI线程?这async/wait模型在那里并没有多大意义。

    async Task<DataTable> AccessOracleAsync()
    {
        DataTable dt;
        using(OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString))
        using (OracleCommand cmd = new OracleCommand(@"SELECT * FROM myTbl", conn))
        {
            await conn.OpenAsync();
            using (var reader = await cmd.ExecuteReaderAsync())
            {
                dt = new DataTable();
                dt.Load(reader);                        
            }

        }
        return dt;
    }

如果没有看到你的构造函数,就很难说那里什么是“有意义的”。但你在这里至少有几个选择。

选项1:将调用放入构造函数中。

在这种情况下,你不能使该方法async,并且您肯定不希望继续执行构造函数返回之前需要完成的任何操作。但您仍然可以有效地完成 C# 可以为您做的事情async method:

public MainWindow()
{
    InitializeComponent();

    AccessOracleAsync().ContinueWith(task => { /* do some other stuff */ },
        TaskScheduler.FromCurrentSynchronizationContext());
}

这将在 UI 线程上执行延续,就像您编写的一样await AccessOracleAsync(); /* do some other stuff */。根据需要在延续方法中添加异常处理(即检查task反对并适当处理)。

选项#2:将呼叫放在其他地方。

建议使用Loaded事件,你可以做。这可能看起来像这样:

private async void Window_Loaded(object sender, RoutedEventArgs e)
{
    await AccessOracleAsync();

    // do some other stuff
}

请注意,如果后者看起来合适,恕我直言,它是更好的选择。它让 C# 编译器为您完成繁重的工作,包括处理异常(您可以将调用包装在try/catch一切都“正常”)。

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

如何从主窗口调用异步方法? 的相关文章

随机推荐

  • Node.js 是否有相当于 Python 的 subprocess.run 的东西?

    我正在寻找从node js 执行shell 命令 我希望标准输出显示到终端 在 python 中 我可以使用 subprocess run 来做到这一点 在node js中 我看到child process exec 但这会返回标准输出的缓
  • Visual Studio 2013 Github 提交死锁

    我和几个朋友正在通过 GitHub 开发一个项目 我们都共享同一个分支 这可能是也可能不是一个好主意 我编辑了一些代码并提交了更改 我将提交推送到 GitHub 我正在使用 Visual Studio 2013 它是内置的 Git 工具 但
  • 缓冲参数在 Dapper dot net 中起什么作用?

    精致的点网有一个buffer参数 布尔值 但据我所知only它所做的就是在返回结果之前将结果转换为列表 根据文档 https github com StackExchange Dapper buffered vs unbuffered re
  • Grid.IsSharedSizeScope 和 ItemsControl.ItemTemplate 的 WPF 布局问题

    我正在尝试使用 Grid IsSharedSizeScope 将 ItemsControl 显示的数据绑定控件排列在网格第一列中的一些控件旁边 问题是我无法阻止控件不断垂直增长 如何在不设置 MaxHeight 属性的情况下阻止他们这样做
  • TouchUpInside 事件后无法将 UIButton 保持在选定状态

    我需要一个 UIButton 来保持按下状态 基本上 如果按钮处于正常状态 我想触摸该按钮 它会突出显示其标准蓝色 然后在抬起手指后保持蓝色 我制作了以下 UIAction 并将按钮 Touch Up Inside 事件连接到它 IBAct
  • 为什么有人会创建额外的局部变量只是为了在其上添加最终关键字?

    我遇到过类似这样的代码 public void foo String param1 final String param1F param1 我怀疑作者不知道他可以将 Final 关键字直接放在方法签名中 因为在方法的其余部分中他只使用 pa
  • 初始化向量的特征

    我绝不是密码学专家 我一直在 Stack Overflow 和维基百科上阅读一些问题 但在定义 IV 及其用法方面没有什么是真正 明确的 我发现的几点 IV 被添加到明文消息中以加强加密 IV 是真正随机的 每条消息都有自己独特的 IV 有
  • 使用 Jersey 客户端在 POST 中发送名称值对

    我如何将名称值对作为正文传递给泽西岛的 POST ReST 服务 类似于下面使用 Apache Commons PostMethod 的代码 final PostMethod post new PostMethod url post set
  • 为什么正则表达式的运行时间可以呈指数级增长?

    可以编写在某些情况下需要指数运行时间的正则表达式 这样的例子是 aa aa 如果有奇数个输入a它需要指数级的运行时间 测试这个很容易 如果输入仅包含as 且长度为 51 正则表达式需要几秒钟的时间来计算 在我的机器上 相反 如果输入长度为
  • Rails activerecord:总和、最大值和连接

    我有两个型号users and posts 用户可以投票和查看帖子 users id name posts id count votes count views users id created at updated at 我想要的是过去
  • 向 Array 类添加新方法

    我对数组对象有一个新的要求 所以我需要将自己的方法添加到内置 Array 类中 如何添加新方法 以便无论我创建什么 Array 对象 它也将具有我的实例方法 Use 红宝石公开课 http rubylearning com satishta
  • 在 Windows 7 的 XAMPP 1.8.3 上运行 ImageMagick

    我已经尝试了几个小时让 ImageMagick 在我的本地主机上运行 在 Windows 7 上运行 XAMPP 1 8 3 我已经检查并尝试了在该网站上找到的所有解决方案以及其他数十个解决方案 什么都不起作用 无论我尝试哪种 ImageM
  • 安装 SubGit 存储库时跳过修订

    我在用着SubGit http subgit com 克隆 SVN 存储库 修订版本中的某个位置是某个标记的 副本 当 SubGit 加载每个修订版本时 需要很长时间才能获取这个特定标签 而该标签恰好是 的副本 这会阻止复制 我尝试设置mi
  • Jquery,隐藏和显示第n项之后的列表项

    假设我有一个无序列表 如下所示 ul li One li li Two li li Three li li Four li li Five li ul 我如何使用 JQuery 隐藏最后 2 个列表项并在那里有一个 显示更多 链接 这样当单
  • “运算符=必须是非静态成员”是什么意思?

    我正在创建一个双链表 并重载了运算符 以使列表等于另一个 template
  • 如何在 spring-security-javaconfig 中添加访问拒绝处理程序

    我正在使用 spring security javaconfig 库来实现 Spring Security 如果我使用 xml 配置文件 我会使用类似这样的内容来定义自定义 拒绝访问 页面
  • JavaFX 模态窗口对 Swing 的所有权

    我有一个基于 Swing 构建的应用程序 并与 JavaFX 集成 Swing 的 JFrame 是顶层窗口 JFXPanel 包含不同的 JavaFX 控件 现在 我还集成了 JavaFX 的新警报 API 目前在显示时设置警报的所有权时
  • 使用 zsh 对于大型 /.ssh/config 文件自动完成速度较慢

    我目前有一个 ssh config 文件 其中约有 7000 行 我想看看是否有办法加快 zsh 中的自动完成功能 当我开始输入我想要 ssh 进入的服务器然后按TAB它需要大约 10 秒的时间来向我显示我可以选择的可能的主机 问题是完成
  • 推荐的最低 Android 应用 SDK

    我正在制作一个 Android 应用程序 想知道业界对支持旧版 Android 版本 如 GingerBread 和 FroYo 的想法是什么 像我这样的开发人员是否应该采取额外的步骤来使我的应用程序与这些旧版本兼容 或者它们是否已过时 我
  • 如何从主窗口调用异步方法?

    所以我写了一个快速的async方法将一些数据放入DataTable来自 Oracle 数据库 我该怎么称呼这个MainWindow 不阻塞UI线程 这async wait模型在那里并没有多大意义 async Task