首页 文章

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

提问于
浏览
0

我正在使用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服务,该服务异步进行长图像处理 .

My problem:

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

我无法弄清楚为什么当我进行更改以运行SaveImageProcedure函数async时,它会导致WCF无法像同步运行那样工作 .

1 回答

  • 1

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

相关问题