使函数异步运行,使该函数中的异步 WCF 调用无法正常运行



我正在使用 Amazon SQS 上传图像文件。我有一个函数可以检查新的 SQS 消息并在循环中读取消息并运行一个函数

法典:

if (receiveMessageResponse.ReceiveMessageResult.Message.Count != 0)
 {
   for (int i = 0; i < receiveMessageResponse.ReceiveMessageResult.Message.Count; i++)
             {
                 string messageBody = receiveMessageResponse.ReceiveMessageResult.Message[i].Body; // read as json text
                 dynamic dynResult = JObject.Parse(messageBody);
                 ImageServiceReference.statePackage sp = new ImageServiceReference.statePackage();
                 ..... // some sp objevt initialization
                 Task.Factory.StartNew(() =>
                  {
                      SaveImageProcedure(sp); 
                  });
          }
}

在工作代码中,我在没有任务的情况下调用SaveImageProcedure(同步)。但现在我想让SaveImageProcedure异步运行。

在该函数中,保存图像过程我有一个任务:

var task = Task<int>.Factory.FromAsync(proxy.BeginSaveImage(sp, new AsyncCallback(CompleteSave), state), proxy.EndSaveImage);

此任务调用异步进行长图像处理的 WCF 服务。

我的问题:

当我使用 Task.Factory.StartNew 异步调用 SaveImageProcedure 时,WCF 不会处理图像,无论是在没有Task.Factory.StartNew(只是函数名称本身)的情况下运行它时,它运行良好并且我看到图像已处理。

我不知道为什么当我进行更改以异步运行 SaveImageProcedure 函数时,它会导致 WCF 无法像同步运行那样工作。

SaveImageProcedure已经是异步的,因为Task<int>.Factory.FromAsync是异步的。为什么需要它周围的Task.Factory.StartNew?这将使用一个额外的线程,一旦你用完了线程池中的所有线程,程序将变得非常慢,因为线程池大小是使用非常慢的爬山算法增加的。我很想看看该例程运行时程序中的线程数。

最新更新