我们正在尝试开发一个WCF服务来执行长时间运行的任务。实现长时间运行任务的方法产生一个新任务,如果任务已成功排队,则立即返回客户端(在我们的例子中是.aspx页面)。该服务在其自己的应用程序池上运行,没有回收和单个InstanceContextMode。
WCF服务
[OperationContract]
public bool testThreadAbortException()
{
Task.Factory.StartNew
(
() =>
{
try
{
//long operation
int i = 0;
while (i < 250)
{
int j = 0;
while (j < 2000000) j++;
i++;
}
ThreadState state = Thread.CurrentThread.ThreadState;
string dummy = "finished ";
}
catch(Exception exception)
{
ThreadState state = Thread.CurrentThread.ThreadState;
string msg = exception.Message;
Exception inner = exception.InnerException;
}
}
);
return true;
}
客户端
protected void btnRun_Click(object sender, EventArgs e)
{
_default.IISHOST_ETLSchedulerServiceReference.ETLSchedulerServiceClient client = new _default.IISHOST_ETLSchedulerServiceReference.ETLSchedulerServiceClient();
bool ret = client.testThreadAbortException();
}
现在的问题是,当正在执行testThreadAbortException方法时,我抓住了Thread正在被中止的异常(这总是在客户端退出事件处理程序方法之后发生)。奇怪的是,这个异常只是第一次抛出(即如果我再次按下运行按钮,代码执行正常)。我必须重新启动本地IIS以再次复制错误。