在 C# 中同步包装异步方法

2023-11-24

我有一个第三方库,其中包含一个异步执行函数的类。该类继承自Form。该函数基本上根据数据库中存储的数据执行计算。一旦完成,它就会在调用表单中调用 _Complete 事件。

我想做的是从非 Windows 表单应用程序同步调用该函数。问题是,无论我做什么,我的应用程序都会阻塞,并且 _Complete 事件处理程序永远不会触发。从 Windows 窗体中,我可以使用“完整”标志和“while (!complete) application.doevents”来模拟同步运行的函数,但显然 application.doevents 在非 Windows 窗体应用程序中不可用。

是否有什么东西会阻止我在 Windows 窗体应用程序之外使用该类的方法(因为它继承自“Form”)? 有什么办法可以解决这个问题吗?

谢谢, 麦克风


尝试一下可能值得尝试类似下面的方法,它使用 WaitHandle 来阻止当前线程,而不是旋转和检查标志。

using System;
using System.Threading;

class Program
{
    AutoResetEvent _autoEvent;

    static void Main()
    {
        Program p = new Program();
        p.RunWidget();
    }

    public Program()
    {
        _autoEvent = new AutoResetEvent(false);
    }

    public void RunWidget()
    {
        ThirdParty widget = new ThirdParty();           
        widget.Completed += new EventHandler(this.Widget_Completed);
        widget.DoWork();

        // Waits for signal that work is done
        _autoEvent.WaitOne();
    }

    // Assumes that some kind of args are passed by the event
    public void Widget_Completed(object sender, EventArgs e)
    {
        _autoEvent.Set();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中同步包装异步方法 的相关文章

随机推荐

  • Node.js / npm - 无论如何判断一个包是否是纯 JS?

    我注意到 在尝试使用 npm 安装看似简单的节点包时 例如nerve 一个 微框架 我经常遇到某种形式的依赖痛苦 经过一番挖掘 我勇敢地找到了问题所在bcrypt模块 显然是用 C C 编写的 必须在包管理器下载后进行编译 不幸的是 如果您
  • OAuth 2 中的访问令牌撤销实现

    我使用 OWIN OAuth 2 来实现我的授权服务器提供程序 现在 我想实现令牌撤销 当我的客户端应用程序想要注销时 任何人都可以帮助我并告诉我如何在 OWIN KATANA OAuth 2 中实现令牌撤销 是否有一些好的做法 OAuth
  • 使用 JSCH 设置目录权限 CHMOD

    在Unix中 如何使用JSCH设置目录权限 我想做 drwxrwxrwx Filezilla 说该整数是 775 但 JSCH 未正确设置权限 JSCH 设置权限后 Filezilla 说是 407 这对我有用 sftp chmod Int
  • 函数式语言:现实生活中的例子

    函数式语言可以解决日常业务问题吗 是否有使用函数式语言 最好是发布的测试用例 实施的成功项目 上面列出的有不少现实世界中的函数式编程 从网站 真实世界的主要标准是该程序主要是为了执行某些任务而编写的 而不是主要为了尝试函数式编程
  • 如何实现 MPVolumeView?

    我希望用户能够使用滑块更改系统音量 并且我意识到实现此目的的唯一方法是使用 MPVolumeView 但我找不到它的任何示例代码 并且我尝试实现的每个方法都不会显示 那么实现 MPVolumeView 最简单 正确的工作方法是什么 将其作为
  • 如何以编程方式在四开本中生成选项卡集面板?

    我在下面提供了一个可重复的小示例 我想在四开中为命名列表中的每个 ggplot 对象生成选项卡plots 下面的四开文档将在其自己的二级标题中呈现图形 但不会按预期呈现在选项卡中 title Untitled format html r l
  • 修改innerHTML后保存/恢复内容可编辑的选择

    我知道在 contentEditable 中获取 设置光标位置几乎是不可能的 我不在乎知道这些信息 我需要能够保存当前选择 修改 div 的innerHTML 然后恢复选择 我一直在尝试提供的答案contenteditable 选定的文本保
  • Windows 10 TTS 语音未显示?

    我安装了一些英语语言包 美国 英国和加拿大 及其语音选项 我可以在 Windows 10 设置 gt 语音中访问它们 但它们不会显示在控制面板提供的文本到语音选项中 我无法通过应用程序使用声音 我可以使用默认声音 David 和 Zira
  • 以此比例因子查询耗尽的资源

    我在 Amazon Athena 上运行 SQL 查询 我多次收到以下错误 以此比例因子查询耗尽的资源 此查询针对 test1 数据库运行 除非查询限定 请在我们的论坛上发布错误消息或联系客户支持并提供查询 ID 如果没有看到查询 很难确定
  • 尝试使用 XPages 将多值字段连接到 Java Bean 时出现类型不匹配

    我有这个代码
  • php 中的新限制:每个 POST 1000 个字段。有人知道这个数字是否会受到影响吗?

    在较新的 PHP 版本中 每个公式 POST 的输入字段数将限制为 1000 未经验证的信息 看来这个限制已经安装在 5 2 的某些版本中 这给我们的网上商店带来了很多问题 有人了解更多吗 这个限制是否会受到参数或变量的影响 我刚刚找到了
  • 为什么这个野牛代码会产生意外的输出?

    弹性代码 1 option noyywrap nodefault yylineno case insensitive 2 3 include stdio h 4 include tp tab h 5 6 7 8 return 9 retur
  • 如何对互联网地址进行编码

    发送电子邮件的代码如下 MimeMessage msg new MimeMessage session msg setSubject subject UTF 8 here you specify your subject encoding
  • 如何向 SqlParameter[ ] 集合添加新参数?

    我想使用类似的东西 using DataSet ds new DataSet SqlParameter dbParams new SqlParameter new SqlParameter PromptID promptID if scen
  • 如何为 alamofire Post 请求中的参数之一传递 nil 值

    我想传递一个 nil 值 即可选参数值之一 并且它必须以 nil 值继续阿拉莫菲尔 帖子请求 如果您告诉我下一步如何进行 会有帮助吗 let image UIImage UIImage let imageData UIImagePNGRep
  • 在 Perl 中,当我在同一个哈希上循环时,从哈希引用中删除键是否安全?为什么?

    我基本上想这样做 foreach my key keys hash ref Do stuff with my key and hash ref Delete the key from the hash delete hash ref gt
  • 为什么链接中的目标属性有下划线?

    我已经编码很多年了 直到此刻我才意识到这个属性target从元素 a 要求它们的所有值都以下划线开头 我们很多人都知道 但我不知道为什么 我的意思是 从我的头脑中 我不记得除此之外的另一个需要以下划线开头的值 有谁知道这个实现背后的原因是什
  • Google Play 游戏服务多人设备方向更改将用户踢出房间

    我正在开发一个只有一项活动的应用程序 它扩展了基础游戏活动 并在多个片段之间切换 很像 Google 的示例代码状态 我现在正在两台独立的设备上测试多人游戏 两个用户都可以成功登录 互相发送消息等 但是 一旦一个用户旋转设备 他们就会被踢出
  • 如何以字节块的形式播放视频?

    我想在 android 中播放我保存在资源文件夹中的视频 我已将其更改为字节数组 并且使用以下代码可以成功播放 private String getDataSource throws IOException InputStream stre
  • 在 C# 中同步包装异步方法

    我有一个第三方库 其中包含一个异步执行函数的类 该类继承自Form 该函数基本上根据数据库中存储的数据执行计算 一旦完成 它就会在调用表单中调用 Complete 事件 我想做的是从非 Windows 表单应用程序同步调用该函数 问题是 无