【问题标题】:Synchronize asynchronously invoked methods?同步异步调用的方法?
【发布时间】:2012-07-09 14:14:40
【问题描述】:

假设您在 UI 线程上异步调用方法。

UIDispatcher.BeginInvoke( new Action(_insert), DispatcherPriority.Normal, new object[] { } )

您正在执行调用。从现在开始,运行时环境决定何时执行该方法,而程序继续其“正常”执行路径。

我现在想知道是否有任何机制可以在这些异步执行的方法返回时同步它们?似乎与使用多线程时存在几乎相同的问题。

但是在被认为是线程之前已经异步调用了返回方法吗?似乎不是这样,因为通常的同步工作像

lock (someObject) { //... }

或使用专用锁似乎不起作用。

附录:

我出现这个问题的实际情况如下:

异步调用的方法调用作为它的最后一条语句是静态类的returnmethod。在这个return 方法中,必须同步一个常用资源(一个列表)。考虑以下(类似概述的)代码片段来举例说明:

// A simple method that gets invoked asynchronously
public void _insert () {

    // do some code

    StaticClass.Returned();
}


public static StaticClass {

   //...

   public static void Returned () {

        // use a shared resource !
   }

}

【问题讨论】:

  • BeginInvoke() 返回一个DispatcherOperation,让您等到异步调用完成并获得其结果;这就是你要找的吗?
  • 好吧,我需要一种方法来确保 Returned 方法中的代码互斥地执行。 DispatcherOperation 对象似乎是一个有用的工具,但我认为它不会帮助我实现这一目标。
  • 互斥什么?您只显示了对共享资源的一种访问权限。我非常怀疑lock 是否无法正常工作,如果不能正常工作,您可能有更多的任何对象的实例用作信号量 - 在调试器中检查。
  • StaticClass 的所有Returned() 调用互斥。假设我调用方法 _insert() 的 1000 次,这意味着 Returned 的执行完全混合,具体取决于 insert() 的执行持续时间和执行异步调用的调度程序。
  • 嗨,马克。使用锁定语句。它确实有效。也许你在其他地方有错误。是的,电话会混淆。

标签: c# asynchronous synchronization method-invocation


【解决方案1】:

使用 .NET 的异步模式,BackgroundWorkerManualResetEvent

http://msdn.microsoft.com/en-us/library/ms228969.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多