问题标签 [begininvoke]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2796 浏览

vb.net - VB.Net:了解 Application.Run() 的工作方式

Hans Passant 在这里给了我一个很好的答案,所以我想询问更多细节以尝试了解其工作方式Application.Run()

据我从文档中了解到,似乎Application.Run()在当前线程上启动了一个消息循环,这反过来又使它能够处理用户输入(对吗?)。重载的版本 Application.Run(Form)基本一样,只是在窗体关闭时存在,并且默认显示窗体。

这就提出了几个问题:

  • 如何简单地从Main()sub 调用一个可以与用户通信的函数(消息框等)并等待它退出?
  • 当消息循环在没有表单的情况下启动时,如何从这个循环中启动一个新表单,并等待它退出?ShowDialog可以工作,除非您不希望表单在启动时立即显示(例如,如果您有一个已启动的 for 最小化到系统托盘)
    • 基本上,情况如下: sub `Main` 有一个要在 20mn 内执行的任务列表,系统托盘图标告诉用户程序将在 20mn 内运行。一个计时器在 20 毫秒后滴答作响,并且必须执行大约。15个任务一个一个,每次创建一个进度对话框的实例,最初隐藏在任务栏中。
    • `ShowDialog` 会显示不需要的表单;所以我这样做的方法是将进度对话框传递给启动下一个任务的函数的回调。但这不会在第二个进度表退出之前退出第一个进度表,对吗?这意味着最终将打开 15 个表格...
    • 所以解决方案可能是在主应用程序循环上调用(begininvoke?)回调......只是,我不知道该怎么做,因为我没有与循环关联的表单来调用回调...

    我希望我的问题很清楚(我可能会混淆很多东西,对不起),
    谢谢,
    CFP。

    0 投票
    0 回答
    220 浏览

    c# - BeginInvoke 激活表单

    我有一个用 C# 编写的 WinForms 应用程序。打开时出现的第一个屏幕是仪表板屏幕,可能需要一些时间才能加载。在委托上使用 BeginInvoke 调用数据加载方法。那部分很好,我的问题是当我想将读取的数据加载到一些网格中时。让我回到我的 UI 线程的代码看起来像这样

    这一切都毫无错误地发生。我的问题是仪表板表单会跳到屏幕顶部。如果数据加载花费了足够长的时间,用户可能已经从应用程序中进入另一个(所以这真的很烦人)。LoadDashboardData 方法除了分配一些 DataGridView 控件的 DataSource 属性外并没有做太多的事情。

    0 投票
    2 回答
    305 浏览

    .net - 多次异步调用方法导致 OutOfMemory 异常

    问题:如果我使用大 PDF 文件(50Mb,1500 页)异步调用 LoadFile() 几次(10-20 次就足够了),那么我很快就会得到 OutOfMemory 异常。如果我在 EndInvoke() 之后调用 GC.Collect() ,那么它可以解决问题。

    同步调用效果很好(不会发生内存泄漏)。

    关于如何在不直接调用 GC.Collect() 的情况下解决它的任何想法?

    0 投票
    1 回答
    7201 浏览

    c# - 多线程环境中 SendOrPostCallback 和 Action 的区别?

    我对使用线程还很陌生。我试图设置 aDependencyProperty的值:

    我意识到在设置器中你必须使用 SendOrPostCallback 的艰难方式(因为它在调用方法时提供了一个参数)。它不适用于 Action (因为缺少参数。而且,wpf 真的是个婊子,调试并找到 TargetParameterCountException 的原因,“没有可用的源”并且根本没有任何线索。

    为什么我必须在那里使用 SendOrPostCallback?我怎么知道在这种情况下这是正确的?因为实际上调用 setter 是通过以下方式工作的:

    并使用 SendOrPostCallback 而不是当然会导致 TargetParameterCountException..

    只是想知道这样看似不一致的事情是否只是常识?在这里感觉有点迷失,至少因为使用 SendOrPostCallback、Action 和 BeginInvoke 作为关键字进行谷歌搜索并没有有意义的结果。

    0 投票
    2 回答
    180 浏览

    c# - 试图理解日志阅读器

    我试图理解一些代码。它是一个打印日志数据的小程序。它是通过使用由 DataTable 填充的 DataGridView 创建一个表单来完成的。表单类还具有刷新功能(RefreshPresentation)。BusinessLogic 类执行更新 DataTable 和调用表单中的刷新函数的实际工作。所以我非常了解它的功能,但不知道为什么程序的结构是这样的。

    1. 为什么 businessLogic.DoWork 作为线程而不是普通的方法调用运行?
    2. 有人可以为我解释一下 RefreshPresentation 功能吗?(BeginInvoke 和委托)
    3. 将 MainForm 作为参数传递给 BusinessLogic 是一个好主意/做法吗?

    这是应用程序的主要入口点。

    这是表格的相关部分。

    这就是业务逻辑。

    0 投票
    1 回答
    896 浏览

    .net - 打印对话框焦点问题

    我在我的桌面应用程序中使用 PrintDialog。从 Button 或上下文菜单调用它时,它工作正常。但是,当我单击用于调用 PrintDialog 的工具提示按钮时,尽管 printdialog 窗口处于活动状态,但我并没有将焦点放在打印按钮上。我需要单击两次才能打印。

    我得到的解决方案是使用 BeginInvoke 和委托来调用异步,现在我可以通过以下代码获得焦点。

    ShowThePrintDialog printD = new ShowThePrintDialog(p.ShowDialog); this.BeginInvoke(printD);

    我想捕获 DialogResult 并根据单击 printdialog 上的按钮进一步进行操作。

    任何人都可以告诉我如何在使用 BeginInvoke 时捕获 DialogResult 吗?

    拉曼

    0 投票
    1 回答
    284 浏览

    .net - 是否有 Control.BeginInvoke 的变体在句柄被销毁之前/之后工作?

    我有一个显示底层异步对象状态的控件。该对象引发事件,这些事件到达表单,在那里它们基本上被排队并最终使用 BeginInvoke 调用。

    处理控件时会出现问题。因为事情是异步发生的,这意味着在处理过程中总是有可能事件回调排队,我有时会得到一个 InvalidOperationException(在创建窗口句柄之前不能在控件上调用 Invoke 或 BeginInvoke。)。

    这不是我想要的行为。即使控件已被释放,我也希望回调执行(即使这会导致回调中的异常;这对我来说是一个更有用的异常!)。我想在每个回调中处理已释放的状态行为(如果已释放,通常只是跳过,但有时不会[例如,一个控件记录事件(可选到文件)并且我不想丢失日志数据!]。)。

    有没有一种方法可以按我想要的方式工作?我可以自己写一个不脆的吗?

    0 投票
    7 回答
    10006 浏览

    .net - Delegate.EndInvoke() 真的有必要吗?

    我已经阅读了几个论坛,甚至一两个 stackoverflow 问题都说在使用 Delegate.BeginInvoke 时必须使用 Delegate.EndInvoke。我读过的很多关于使用 BeginInvoke 的文章都没有提到使用 EndInvoke。此外,我仅使用 BeginInvoke 部署了生产代码,似乎没有任何内存问题。我使用 BeginInvoke 的方式通常是使用我不关心它们何时完成或它们需要多长时间来处理的线程。

    0 投票
    1 回答
    1166 浏览

    c# - BeginInvoke:调用过多


    请看下面的代码。

    如果异步调用的方法休眠 5 分钟。那么创建 5 个 lac 线程是否正确?

    谢谢。

    0 投票
    1 回答
    5755 浏览

    .net - 我可以将 BeginInvoke 与 MulticastDelegate 一起使用吗?

    我想从我的库类中引发一系列事件,但我担心某些事件订阅者会很粗鲁并且需要很长时间来处理某些事件,从而阻塞引发事件的线程。我想我可以通过使用线程池线程来引发每个事件来保护引发线程:

    当事件只有一个订阅者时,这可以正常工作,但是一旦第二个订阅者到达,DataPacketReceived就会成为多播委托,并且我收到带有错误消息的参数异常,“委托必须只有一个目标。” 有没有一种简单的方法可以在单独的线程上引发事件,还是我必须启动一个线程然后从那里引发事件?