从工作线程 C# CF 在主线程中抛出事件

2024-04-25

我有,可能是,一个简单的问题。我正在使用互操作来调用 CompactFramework 中的异步函数。获得执行结果后,我想引发一个事件,该事件将被表单捕获,并根据结果,我将在屏幕上呈现一些数据。然而,问题是,当互操作函数返回结果时,它会在工作线程上返回它,如果我引发一个事件,它将保留在工作线程上,并且我无法呈现表单中的任何数据,除非我使用调用。

有人可以建议一种将工作线程合并到主线程的方法吗?并从主线程引发一个事件?我发现了一些循环订阅事件的委托并使用 BeginInvoke 在主线程中引发事件的示例,但是,它们都使用 ISynchronizeInvoke,这在 Compact Framework 中不可用。

我的代码如下:

public delegate void CellTowerFoundEventHandler(CellTower towerInfo);

public class CellTowerProvider
{
    public delegate void RILRESULTCALLBACK(uint dwCode, IntPtr hrCmdID, IntPtr lpData, uint cbData, uint dwParam);
    public delegate void RILNOTIFYCALLBACK(uint dwCode, IntPtr lpData, uint cbData, uint dwParam);
    private RILCELLTOWERINFO towerDetails;
    private CellTower cellTowerInfo;
    private IntPtr radioInterfaceLayerHandle;

    public CellTowerProvider()
    {
        radioInterfaceLayerHandle = IntPtr.Zero;
        IntPtr radioResponseHandle = IntPtr.Zero;

        // Initialize the radio layer with a result callback parameter.
        radioResponseHandle = RIL_Initialize(1, new RILRESULTCALLBACK(CellDataCallback), null, 0, 0, out radioInterfaceLayerHandle);

        // The initialize API call will always return 0 if initialization is successful.
        if (radioResponseHandle != IntPtr.Zero)
        {
            return;
        }

        // Query for the current tower data.
        radioResponseHandle = RIL_GetCellTowerInfo(radioInterfaceLayerHandle);
    }

    public void CellDataCallback(uint dwCode, IntPtr hrCmdID, IntPtr lpData, uint cbData, uint dwParam)
    {
        // Refresh the current tower details
        towerDetails = new RILCELLTOWERINFO();

        // Copy result returned from RIL into structure
        Marshal.PtrToStructure(lpData, towerDetails);

        cellTowerInfo = new CellTower()
        {
            TowerId = Convert.ToInt32(towerDetails.dwCellID),
            LocationAreaCode = Convert.ToInt32(towerDetails.dwLocationAreaCode),
            MobileCountryCode = Convert.ToInt32(towerDetails.dwMobileCountryCode),
            MobileNetworkCode = Convert.ToInt32(towerDetails.dwMobileNetworkCode),
        };

        if (CellTowerFound != null)
            CellTowerFound(cellTowerInfo);

        // Release the RIL handle
        RIL_Deinitialize(radioInterfaceLayerHandle);
    }

}

为什么不在库对象的构造函数中创建一个控件?如果您假设库实例是在 UI 线程中创建的,则可以调用 Control.Invokethat控制在您的库内部,事件调用将在使用者的 UI 线程上进行。

当然,这并不是绝对正确的。消费者可能会在工作线程中创建实例,但它至少提供了您所追求的某种程度的内容,如果他们使用工作线程,他们实际上会期望事件无论如何都需要 Invoke 调用。

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

从工作线程 C# CF 在主线程中抛出事件 的相关文章

  • 是否有与 SQL Server newsequentialid() 等效的 .NET

    我们使用 GUID 作为主键 您知道默认情况下它是集群的 将新行插入表中时 它将插入表中的随机页 因为 GUID 是随机的 这会对性能产生可衡量的影响 因为数据库始终会分割数据页 碎片 但我使用顺序 GUID 的主要原因是因为我希望将新行插
  • C++ 最大非负整数

    以下内容是否会在所有平台 int 大小等上按预期工作 或者有更容易接受的方法吗 我做了以下的事情 define MAX NON NEGATIVE INT int unsigned int 1 2 我不会通过解释它在做什么来侮辱你的智商 编辑
  • Microsoft Visual C++ 2008 和 R2007b 的 Mex 类型

    我想对 vs2008 和 matlab2007b 使用 mex 类型 我尝试了下面的代码 include
  • C++ 中的可变参数函数声明中省略了逗号

    我习惯于这样声明可变参数函数 int f int n 读书时C 编程语言我发现书中的声明省略了逗号 int f int n the comma has been omitted 这个语法似乎是 C 特定的 因为当我尝试使用 C 编译器编译它
  • C# 中的 DateTime.Parse 抛出异常

    我不知道为什么抛出异常 这是工作代码 DateTime Parse 1 12 2012 12 00 00 AM 这是抛出异常的一个 DateTime Parse 1 13 2012 12 00 00 AM 抛出的异常是 格式异常 包括此消息
  • “上下文模式”的这种实现看起来不错吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有多个处理单元可能存在于一个数组中 每个处理单元都有自己的参数 我想使用以下方式传达每个处理单元的参数上下文模式在它被建议作为另一个问题的解答 ht
  • 返回 ObjectResult 会导致 406 Not Acceptable

    在学习 Scott Allen 的 Pluralsight 课程 Asp net Core 1 0 基础知识 时 在 MVC 框架中的控制器 模块和 操作结果 部分中 我在 Index 操作方法上遇到了 406 Not Acceptable
  • 如何测试 PARTIAL 视图在 C# ASP .NET MVC 中呈现

    我有一个视图 它内部有部分视图渲染 div class partialViewDiv Html RenderPartial partial Model SomeModelProperty div 和一个返回此视图的控制器 public Ac
  • g++.exe 和 x86_64-w64-mingw32-g++.exe 有什么区别?

    同样的问题也适用于 gcc ar 等 在 Code Blocks 中将工具链可执行文件从 Something exe 更改为 x86 64 w64 mingw32 something exe 时 代码仍然可以完美编译 此外 32 位和 64
  • 一个阻塞但非模态的 QDialog?

    我有一堆图像 我想对其执行一些操作 处理完每个图像后 我的程序应该弹出一个对话框 提示用户是否要继续处理下一个图像或中止 在此之前 他们应该有机会对图像或参数进行一些手动更改 无论如何 他们必须能够访问应用程序的窗口 而调用对话框的方法的执
  • 类模板的可变参数构造函数模板的特化

    这是一个带有可变参数构造函数的类 它专门用于从临时对象进行复制和移动 template
  • Python多线程模型

    我已经研究 python 中的多线程有一段时间了 但是我对一些问题感到困惑 首先 python线程库创建的线程是用户级线程还是内核级线程 书上说用户级线程必须映射到内核线程并且 操作系统仅创建和维护内核级线程 python中将使用哪种线程模
  • 自定义文件属性

    我需要遵循 在我的申请中 我有文件 需要随时签入和签出的文件 当我从应用程序中签出文档时 我需要将自定义属性添加到文件中 以便稍后在签入文档时可以识别它 我尝试使用以下代码使用 DSOFile 中的 OleDocumentPropertie
  • .NET 配置(app.config/web.config/settings.settings)

    我有一个 NET 应用程序 它具有用于调试和发布版本的不同配置文件 例如 调试 app config 文件指向开发SQL服务器 http en wikipedia org wiki Microsoft SQL Server它启用了调试并且发
  • 在javascript中调用c#函数[重复]

    这个问题在这里已经有答案了 可能的重复 从 Javascript 调用 ASP NET 函数 https stackoverflow com questions 3713 call asp net function from javascr
  • 在 QtCreator 中查看数组内容

    调试时是否可以在 Qt Creator 中查看数组的内容 似乎检测到我的数组是一个数组而不是一个指针 此外 我可以点击一个箭头 就像展开一样 但之后什么也没有显示 当我试穿的时候std vector Qt Creator 设法按预期显示内容
  • 在 Winforms 中,PreviewKeyDown() 从未针对任何键触发

    我最初试图让我的程序获取箭头键 上 下 左 右 的输入 但发现在 KeyDown 中这些键从未出现过 后来我发现我可以通过进入 PreviewKeyDown 函数并设置来启用箭头键 e IsInputKey true 及其周围的任何条件和逻
  • 自定义编译器警告

    在 Net 中使用 ObsoleteAtribute 时 它 会向您发出编译器警告 告诉您该对象 方法 属性已过时 应使用其他内容 我目前正在从事一个需要大量重构前员工代码的项目 我想编写一个自定义属性 可用于标记方法或属性 这些方法或属性
  • 带有 epgm 的 ZeroMQ PUB/SUB 无法接收同一主机上进程发送的消息

    我的所有进程都有两个套接字 一个 PUB 和一个 SUB 并且它们都使用相同的多播地址和端口 例如 PUB 会这样做 绑定 epgm 239 192 1 1 5555 SUB 将执行以下操作 连接 epgm 239 192 1 1 5555
  • C# 泛型中的通配符等效项

    假设我有一个通用类 如下所示 public class GeneralPropertyMap

随机推荐

  • 递归算法无法在指定时间内完成测试

    我正在进行一项测试 需要二进制断层扫描算法 提供了一组 38 个测试值来测试正确性 但完成所有测试也有 1 CPU 秒的时间限制 问题如下 如果存在 m n 矩阵 A 且每个元素为 0 或 1 则输出 Yes 使得 否则输出 否 对于每个测
  • 在以下任何来源中均未找到插件 [id: 'org.jetbrains.kotlin.jvm', 版本: '1.2.71']

    我全新安装了 IntelliJ 使用以下设置创建了一个新的 kotlin gradle 项目 这会生成以下 build gradle kts 完全相同的文件在我的 Windows 计算机上运行 import org jetbrains ko
  • 创建可以传递参数而无需创建新组件的函数

    我的问题与这个问题有关React用于渲染函数中的绑定函数 以下不是好的做法 render div 因为每次重新渲染都会向页面添加一个新功能 最终导致浏览器内存不足 解决方案是这样做 constructor this callFunction
  • Google Chrome 中 array.splice() 的时间复杂度是多少?

    如果我使用 splice 从数组中删除一个元素 如下所示 arr splice i 1 这会是O n 在最坏的情况下 因为它会移动 i 之后的所有元素 或者它是常数时间 下面有一些链表魔法 最坏的情况下should be O n 复制所有n
  • .NET:属性何时实例化?我可以获得它们所修饰的类型的引用吗?

    关于属性的两个问题 属性类什么时候实例化 当第一次访问类型时 还是在开始执行时 从属性类中 我可以找出该属性是为哪种类型实例化的吗 我的想法是 我想列出程序集中应用了我的属性的所有类的列表 我当然可以通过反射和检查来迭代所有这些 但如果该属
  • r中的模糊字符串匹配

    我有 2 个数据集 每个数据集超过 100K 行 我想根据匹配一列 电影标题 的模糊字符串以及使用发布日期来合并它们 我提供了下面两个数据集中的样本 数据集 1 itemid userid rating time title release
  • 更改 UISearchBar 的大小

    无法找到答案 也无法做我想做的事 CGSize searchBarSize self searchDisplayController searchBar frame size searchBarSize width
  • 如何使用 URLSession 从 url 获取 JSON 数据?

    我正在开发一个 iOS 应用程序 我必须从中获取数据this url https dl dropboxusercontent com s 2iodh4vg0eortkl facts json 我可以看到这个 url 包含 JSON 数据 所
  • Android FloatingActionButton 带有片段和底部导航栏

    我正在创建一个具有以下结构的 Android 应用程序 主要活动有一个底部导航栏 可在 3 个不同的片段之间切换 其中 2 个片段将显示项目列表 并使用浮动操作按钮 FAB 添加新项目 第三个片段将显示不同的内容 不需要 FAB 基于此 F
  • 使用 gradle 进行简单的 protobuf 编译

    如果您正在寻找示例 gradle protobuf 项目 请查看here https github com google protobuf gradle plugin tree master examples exampleProject
  • “没有路线匹配”错误?

    我是新的 Rspec 刚刚开始在 Rails 3 上生成一个新的控制器 它默认生成一些 Rspec 测试 我有一个关于如何让它们通过的问题 就目前情况而言 我在我的终端中看到了这个测试 1 BuildingsController GET s
  • 将数据写入文本文件

    我有一个简单的程序 将 7 个数字中的 6 个写入文本文件 从逻辑上讲 一切似乎都很好 但是 数字并未按预期写入文件 Random random new Random Console WriteLine Please enter the n
  • 将 json 数据 objectForKey 分配给类的属性的替代语法

    我可以将最后三行代码写在一行中吗 NSArray latestLoans self JsonData objectForKey loans for id object in latestLoans NSDictionary loan obj
  • 使用 Testcafe 访问 OpenVPN 限制的网站

    有一个网站只有在运行 OpenVPN Connect 2 1 3 111 配置文件时才能访问 我需要使用 Testcafe 访问该网站 但到目前为止我还没有找到任何有关使用 Testcafe 与 VPN 的文档 有什么我可能错过的吗 测试通
  • git clone 永远挂在 github 上

    当我按照 github 中的第 5 点 测试所有内容 时guide http help github com linux set up git ssh 命令也永远挂起 根据该指南 我应该看到一条消息 Github 不提供 shell 访问
  • Python 使 UMAP 更快(呃)

    我正在使用 UMAP https umap learn readthedocs io en latest https umap learn readthedocs io en latest 以减少数据的维度 我的数据集包含 4700 个样本
  • Math.min.apply 对于 null 返回 0

    我想从数组中获取最小值 如果数据包含null value Math min apply回报0 for null价值 请参见这个 JSFiddle 示例 http jsfiddle net jeryslo 7DCXw 即使数组中存在空值 如何
  • 使用 DirectSound 向后读取声音

    是否可以使用 DirectSound 的托管版本向后读取声音 如果没有 是否有另一个库可以轻松实现 您可以使用 WaveFileReader 和 WaveFileWriter 类NAudio http www codeplex com na
  • 如何在 python-docx 中将页面大小更改为 A4

    我尝试使用 python docx 创建 Word 文档 创建的文件的字母尺寸为 8 5 x 11 英寸 但在德国 标准格式是 A4 8 27 x 11 69 英寸 from docx import Document from docx s
  • 从工作线程 C# CF 在主线程中抛出事件

    我有 可能是 一个简单的问题 我正在使用互操作来调用 CompactFramework 中的异步函数 获得执行结果后 我想引发一个事件 该事件将被表单捕获 并根据结果 我将在屏幕上呈现一些数据 然而 问题是 当互操作函数返回结果时 它会在工