停止异步进程永久运行的方法?

3

我将尝试更好地理解异步线程。

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

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

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

当myResult永远不返回true(例如命令永远运行时),aSync会超时吗?还是会一直运行下去?我该如何防止它永远运行?


1
WaitOne不会超时吗?请参见http://msdn.microsoft.com/en-us/library/85bbbxt9.aspx - dash
1
请查看https://dev59.com/j3VC5IYBdhLWcg3wbgdS - benni_mac_b
@dash - 是的,waitone函数确实有超时参数。我已经更新了我的代码。 - John M
2个回答

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

MSDN文档似乎非常明确;文档表示WaitOne方法将等待信号返回(您的目标方法执行并退出)或时间段过去。您可以永远等待(Timespan.Infinite或-1),或立即返回(0)。

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

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

因此,回答您的问题,是的,异步将基于该参数超时。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接