阻止异步进程永远运行?

时间:2011-12-06 21:34:17

标签: c# multithreading .net-4.0 asynchronous

尝试更好地了解异步线程。

C#应用程序包含以下代码:

IAsyncResult myResult = cmd.BeginExecuteNonQuery(); //start
while (!myResult.IsCompleted)
{
      myResult.AsyncWaitHandle.WaitOne(65000);
}
cmd.EndExecuteNonQuery(myResult); //end

我的理解是程序将等到myResult返回true(IsComplete)。

当myResult永远不会返回true(即cmd永远运行)时,aSync会超时吗?或者它会继续运行?如何阻止它永远运行?

2 个答案:

答案 0 :(得分:3)

防止它永远无法运行的最佳方法是指定您管理的超时限制。

例如:

DateTime dtStart = DateTime.Now;
const int TIMEOUT_SECONDS = 120;

while (!myResult.IsCompleted)
{
      if (DateTime.Now.Subtract(dtStart).TotalSeconds > TIMEOUT_SECONDS)
      {
           // Cleanup and bail 
      }
      myResult.AsyncWaitHandle.WaitOne(65000);
}

答案 1 :(得分:1)

MSDN文档似乎非常明确;文档说WaitOne方法将等待,直到返回一个信号(你的目标方法做某事并退出)或时间跨度。你可以让它永远等待(Timespan.Infinite或-1)或立即返回(0)。

@ competent_tech的答案说明了这一点 - 线程将阻塞你的时间跨度,然后,如果总时间已经过去,你可以离开while循环,否则再等一下。

事实上,你可能甚至不需要while循环 - 如果你设置了一个你满意的时间跨度并且过去了,那么线程将会恢复,你可以决定下一步该做什么。

所以要回答你的问题,是的,async将根据该参数超时。

每隔一段时间我都要回去阅读Joe Albahari's线索指南,以便记住它是如何运作的。