首页 > 解决方案 > 当工作线程抛出异常时,是否调用 AsyncCallback

问题描述

我是.net异步编程(异步编程模型)的新手,关于工作线程和异常的关系只有两个问题。下面是一个例子:

private void OnPerformSearch(object sender, RoutedEventArgs e)
{
    WebRequest req = WebRequest.Create("http://www.google.com/#q=weather");
    req.BeginGetResponse(new AsyncCallback(Callback), req);  // here the main thread calls BeginGetResponse() to enqueues the work in threadpool then a worker thread A will get the job done
    ...// do other stuff 
}

private void Callback(IAsyncResult iar)
{
   WebRequest req = (WebRequest) iar.AsyncState;
   try
   {
      WebResponse resp = req.EndGetResponse(iar);
      ProcessResponse(resp);
   }
   catch(Exception x)
   {
      LogError(x);
   }
}

Q1-我们知道该BeginGetResponse方法将线程池中的工作排入队列并立即返回,调用者现在可以继续其他工作,然后线程池中的工作线程(假设是线程A)将完成工作。我的问题是,当线程 A 完成工作时,线程池是否会分配不同的工作线程(线程 B)来调用完成回调?还是线程 A 会继续调用回调?

Q2-我们知道异步操作完成时调用的完成回调。但是如果工作线程A在做作业的时候出错了,会不会认为作业“完成”了,可以调用回调呢?或者在我们重新启动应用程序之前,这个过程会永远卡住?

标签: .netasynchronousthreadpoolclr

解决方案


推荐阅读