Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使函数异步运行,使该函数内的异步WCF调用无法正常运行_C#_.net_Wcf_Asynchronous_Async Await - Fatal编程技术网

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

C# 使函数异步运行,使该函数内的异步WCF调用无法正常运行,c#,.net,wcf,asynchronous,async-await,C#,.net,Wcf,Asynchronous,Async Await,我使用AmazonSQS上传图像文件。我有一个函数,用于检查新的SQS消息,并在循环中读取消息并运行一个函数 代码: 此任务调用一个WCF服务,该服务异步进行长图像处理 我的问题: 当我使用Task.Factory.StartNew异步调用SaveImageProcedure时,WCF不会处理图像,无论我在没有Task.Factory.StartNew的情况下运行它(仅是函数名本身),它运行良好,并且我看到图像已处理 我不明白为什么当我更改为异步运行SaveImageProcedure函数时,它

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

代码:

此任务调用一个WCF服务,该服务异步进行长图像处理

我的问题:

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


我不明白为什么当我更改为异步运行SaveImageProcedure函数时,它会导致WCF不能像同步运行一样工作

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

当我用int res=task.Result运行任务时;任务完成后,工厂。。。代码,它会等待它完成,然后再继续(在循环中使用),因此出于某种原因会逐个处理图像。当我在任务中使用异步调用包装函数时,它会并行处理图像。为什么会发生这种情况?它似乎在等待FromAsync完成,然后继续下一个循环迭代。
task.Result
阻塞直到任务完成,这就是您观察该行为的原因。您应该执行
task.ContinueWith(t=>int res=t.Result)
在任务完成后调用'ContinueWith'语句,这样task.Result就不会阻塞。
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); 
                  });
          }
}
var task = Task<int>.Factory.FromAsync(proxy.BeginSaveImage(sp, new AsyncCallback(CompleteSave), state), proxy.EndSaveImage);