尝试更好地了解异步线程。
C#应用程序包含以下代码:
IAsyncResult myResult = cmd.BeginExecuteNonQuery(); //start
while (!myResult.IsCompleted)
{
myResult.AsyncWaitHandle.WaitOne(65000);
}
cmd.EndExecuteNonQuery(myResult); //end
我的理解是程序将等到myResult返回true(IsComplete)。
当myResult永远不会返回true(即cmd永远运行)时,aSync会超时吗?或者它会继续运行?如何阻止它永远运行?
答案 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线索指南,以便记住它是如何运作的。