使函数运行异步,使该函数内的异步WCF调用运行不正常

时间:2014-02-27 10:05:56

标签: c# .net wcf asynchronous async-await

我正在使用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异步运行。

在该函数中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函数async时,它会导致WCF无法像同步运行那样工作。

1 个答案:

答案 0 :(得分:1)

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