【问题标题】:Asynchronous Invoking - Is EndInvoke required? [duplicate]异步调用 - 是否需要 EndInvoke? [复制]
【发布时间】:2011-06-30 04:56:11
【问题描述】:

可能的重复:
Must every BeginInvoke be followed by an EndInvoke?
Is EndInvoke() optional, sort-of optional, or definitely not optional?

我有一个多线程应用程序,其中一个辅助线程需要每隔几分钟在主线程上执行一次代码。没有任何返回值,第二个线程不关心它是否引发任何异常或运行失败。

到目前为止,我一直让它通过Form.Invoke 运行代码,但有时它需要比平时更长的时间(几秒钟)并阻塞线程直到它完成。我需要第二个线程能够继续执行而不会停顿几秒钟。

BeginInvoke 听起来可以很好地完成这项工作,但我真的没有地方可以打电话给EndInvoke,因为我不想等待它或获得返回值。并且考虑到被调用的代码涉及大量本机调用,我不确定不EndInvoke 是否是个好主意。

我是否需要调用EndInvoke,或者是否有其他方法可以让代码在主窗体线程上异步运行,而我应该使用它来代替?

谢谢 =)

【问题讨论】:

    标签: c# multithreading delegates begininvoke


    【解决方案1】:

    您可以调用 EndInvoke 从委托中检索返回值,如果需要,但这不是必需的。 EndInvoke 将阻塞,直到可以检索到返回值。

    来源:http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx备注下

    【讨论】:

    • 太棒了,所以我可以将我的 Invokes 更改为 BeginInvokes 而不会炸毁任何东西。
    【解决方案2】:

    调用 EndInvoke 的一种典型方法是在 BeginInvoke 中包含一个完成回调,以便您可以在回调中调用 EndInvoke。这对于比 Invoke 做更具体的事情的 Begin/End 方法更重要,例如 BeginRead/EndRead;在后一种情况下,可能需要 End 进行清理,并且通常还会(重新)抛出在此过程中发生的任何异常。

    【讨论】:

      【解决方案3】:

      您应该确保调用 EndInvoke,但您可以很容易地做到这一点,例如:

        var action = new Action(SomeMethodGroup); 
      
        action.BeginInvoke(new AsyncCallback(
      
              x => (x.AsyncState as Action).EndInvoke(x)), action); 
      

      【讨论】:

      • 我相信 OP 特别在谈论 Form.BeginInvoke 而不是一般的 Begin/EndInvoke 模式。查看 MSDN,Form.BeginInvoke 似乎并不完全遵循 Begin/EndInvoke 模式。
      • @dtb,事实上,我不认为 Form.BeginInvoke 或 Delegate.BeginInvoke 是绝对必要的,因为我相信它只会在您尝试等待时创建一个 WaitHandle(即调用 EndInvoke。 ) WaitHandle 需要清理,但如果您调用了 EndInvoke,就会清理。
      • 好点子,也许您不需要 EndInvoke,也许是一个简单的方法,可以作为“一劳永逸”的策略?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多