Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# IAsyncResult.AsyncWaitHandle的使用_C#_.net_Asynchronous - Fatal编程技术网

C# IAsyncResult.AsyncWaitHandle的使用

C# IAsyncResult.AsyncWaitHandle的使用,c#,.net,asynchronous,C#,.net,Asynchronous,在异步编程模型中,似乎有4种方法(如中所述)用于进行异步方法调用 调用EndInvoke()方法会使调用线程等待方法完成并返回结果 查看IAsyncResult.AsyncWaitHandle.WaitOne()似乎也会这样做。AsyncWaitHandle获取完成信号(换句话说,主线程等待异步方法的完成)。然后我们可以执行EndInvoke()来获得结果 直接调用EndInvoke()和在WaitOne()/WaitAll()之后调用它有什么区别 在轮询技术中,我们通过调用Thread.Sle

在异步编程模型中,似乎有4种方法(如中所述)用于进行异步方法调用

调用EndInvoke()方法会使调用线程等待方法完成并返回结果

查看IAsyncResult.AsyncWaitHandle.WaitOne()似乎也会这样做。AsyncWaitHandle获取完成信号(换句话说,主线程等待异步方法的完成)。然后我们可以执行EndInvoke()来获得结果

  • 直接调用EndInvoke()和在WaitOne()/WaitAll()之后调用它有什么区别

  • 在轮询技术中,我们通过调用Thread.Sleep()为其他线程利用系统资源提供时间。 AsyncWaitHandle.WaitOne()或EndInvoke()是否使主线程在等待时处于睡眠状态


  • 首先是简单的事情。对于第二个问题,是的,
    WaitOne
    EndInvoke
    确实会使当前线程在等待时休眠

    对于您的第一个问题,我可以立即确定两个差异

  • 使用
    WaitOne
    需要释放等待句柄,而直接使用
    EndInvoke
    不需要任何清理
  • 作为回报,使用
    WaitOne
    允许在
    EndInvoke
    之前,但在任务完成之后执行某些操作

  • 至于那个“东西”可能是什么,我真的不知道。我怀疑在
    EndInvoke
    之前需要分配资源来接收输出。如果你当时真的没有理由做某事,试着不要为
    WaitOne

    Q1而烦恼。代码或应用程序的运行方式没有差异,但可能存在一些运行时差异(同样不确定,但根据我对
    异步委托的理解进行猜测)

    • IAsyncResult.AsyncWaitHandle主要作为同步机制提供,同时使用
      WaitAll()
      WaitAny()
      如果不需要此同步,则不应读取
      AsyncWaitHandle
      属性原因
      AsyncWaitHandle
      不必在异步运行时由委托实现(创建),直到外部代码读取它。我不确定CLR处理异步委托的方式以及它是否创建了WaitHandler,但理想情况下,如果它能够在不创建另一个WaitHandle的情况下运行异步委托,它将不会,但是对WaitOne()的调用将创建此句柄,并且您有额外的责任处理(close)它可以有效地释放资源。因此,建议在
      WaitAll()
      WaitAny()
      不支持同步化要求的情况下,不要读取此属性
    问题2。回答睡眠和等待之间的区别。

    您可以将超时传递给,例如,您可以在等待操作完成时定期执行一些其他活动:

    do {
       //Something else
    ) while (!waitHandle.WaitOne(100))
    

    将每隔100毫秒执行一次操作(+不管其他时间是多少),直到操作完成。

    在这种情况下,测试不是更好,而不是让线程休眠吗?MSDN页面上说:“轮询操作状态(而不是等待同步对象)的客户端使用此属性来确定操作的状态。”@stackx-但我正在等待同步对象-我之所以使用它是因为我想睡眠一段时间,但如果该任务在睡眠期间完成,我的代码立即被重新激活并退出循环(做其他事情),我明白这一点。但我的问题是,为什么你的循环需要被睡眠/等待打断?为什么不跳过睡眠/等待,更快地完成循环中的工作?您在这里考虑的具体优势是什么?