Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何等待异步调用完成?_C#_Silverlight 4.0_Asynchronous - Fatal编程技术网

C# 如何等待异步调用完成?

C# 如何等待异步调用完成?,c#,silverlight-4.0,asynchronous,C#,Silverlight 4.0,Asynchronous,假设我有两个事件A和B,每个事件都会引发一个异步调用,比如AsyncA和AsyncB 我想要的是:when A将仅在AsyncB完成时调用AsyncA 事件A和B按顺序触发:A,然后B。 我期望AsyncA在AsyncB完成之前完成,但实际上,大多数情况下,AsyncB在AsyncA之前完成 我无法将AsyncB调用放入AsyncB已完成事件中。 如何确保AsyncB始终在AsyncA之后 如果顺序比异步方法调用更重要,那么异步方法调用就不合适 如果顺序比异步方法调用更重要,那么异步方法调用就不

假设我有两个事件A和B,每个事件都会引发一个异步调用,比如AsyncA和AsyncB

我想要的是:when A将仅在AsyncB完成时调用AsyncA

事件A和B按顺序触发:A,然后B。 我期望AsyncA在AsyncB完成之前完成,但实际上,大多数情况下,AsyncB在AsyncA之前完成

我无法将AsyncB调用放入AsyncB已完成事件中。
如何确保AsyncB始终在AsyncA之后

如果顺序比异步方法调用更重要,那么异步方法调用就不合适

如果顺序比异步方法调用更重要,那么异步方法调用就不合适

只要两个调用都是异步运行的,您就无法控制它们的顺序。这是由调度程序完成的

但您可以使用TPL让它们同步运行:

System.Threading.Tasks.Task.Factory.StartNew( ( ) => OnAsyncA() )
    .ContinueWith( ( t ) => OnAsyncB() );

只要两个调用都是异步运行的,您就无法控制它们的顺序。这是由调度程序完成的

但您可以使用TPL让它们同步运行:

System.Threading.Tasks.Task.Factory.StartNew( ( ) => OnAsyncA() )
    .ContinueWith( ( t ) => OnAsyncB() );

您不能保证异步调用的完成顺序,但是您可以按照您想要的顺序执行您想要执行的工作。您需要的是一种同步方法

在OnAsyncA中,您需要:

  • 完成您需要完成的工作,如有必要,保存
    OnAsyncB
    所需的信息
  • 设置等待句柄(例如,或)
  • 在OnAsyncB的

  • 保存所需的任何信息(例如结果)
  • 。(在处理程序中等待信号是个坏主意,因为WCF回调发生在UI线程上)
  • 在线程池线程中

  • 等一下把手
  • 完成您通常为OnAsyncB所做的工作
  • 在这方面还有其他的变化,例如使用TPL让运行时间更长的线程从“依赖事件”队列中退出队列,等等


    请记住从线程池线程同步回UI线程。

    您不能保证异步调用的完成顺序,但可以按照您想要的顺序执行您想要执行的工作。您需要的是一种同步方法

    在OnAsyncA中,您需要:

  • 完成您需要完成的工作,如有必要,保存
    OnAsyncB
    所需的信息
  • 设置等待句柄(例如,或)
  • 在OnAsyncB的

  • 保存所需的任何信息(例如结果)
  • 。(在处理程序中等待信号是个坏主意,因为WCF回调发生在UI线程上)
  • 在线程池线程中

  • 等一下把手
  • 完成您通常为OnAsyncB所做的工作
  • 在这方面还有其他的变化,例如使用TPL让运行时间更长的线程从“依赖事件”队列中退出队列,等等



    请记住从线程池线程同步回UI线程。

    您能解释一下为什么不能将对AsyncB的调用放入AsyncA已完成的处理程序中吗?+1用于此经典问题。我想您必须“以某种方式”在AsyncA已完成事件上创建一个房间来调用AsyncB。因为事件a和B是由不同的原因从不同的位置触发的。当它们是由于不同的原因触发时,为什么它们是同步触发的?为什么打电话的人要考虑他们的处理方式?这不是处理程序的问题吗?您能解释一下为什么不能将对AsyncB的调用放在AsyncA完成的处理程序中吗?对于这个经典问题+1。我想您必须“以某种方式”在AsyncA已完成事件上创建一个房间来调用AsyncB。因为事件a和B是由不同的原因从不同的位置触发的。当它们是由于不同的原因触发时,为什么它们是同步触发的?为什么打电话的人要考虑他们的处理方式?这不是处理程序的问题吗?您无法为SLF执行同步调用无法从SL调用WCF服务?我不这么认为。你不能为SL做同步呼叫不能从SL呼叫WCF服务?我不这么认为。这是一种蛮力的方法,我认为这个问题可以也应该被设计出来。也就是说,设计它使B不依赖于A。这可能意味着将所有代码压缩成方法AI不知道为什么这种方法是蛮力。但我同意更好的设计可以避免这些问题。谢谢,伙计们。示例:SL中的DataGrid:单击并双击一行。单击将进行异步调用。双击将进行自己的异步调用。双击总是触发单次单击。我已经尝试了Dispatchermer,但无法实现我的预期。如果这是问题,您应该减慢单击速度。将点击放入队列中,只有在时间阈值下不再识别点击时,才会执行单键点击方法,否则,如果再识别一次点击,就会执行双击方法。这是一种蛮力方法,我认为可以而且应该围绕这一点设计问题。也就是说,设计它使B不依赖于A。这可能意味着将所有代码压缩成方法AI不知道为什么这种方法是蛮力。但我同意更好的设计可以避免这些问题。谢谢,伙计们。示例:SL中的DataGrid:单击并双击一行。单击将进行异步调用。双击将进行自己的异步调用。双击总是触发单次单击。我已经尝试了Dispatchermer,但无法实现我的预期。如果这是问题,您应该减慢单击速度。将单击放入队列中,并且仅当在时间阈值下不再识别单击时,才会执行单键单击方法,否则,如果再识别一次单击,则会执行双击方法。