我正在使用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无法像同步运行那样工作。
答案 0 :(得分:1)
SaveImageProcedure
已异步,因为Task<int>.Factory.FromAsync
是异步的。为什么你需要围绕它Task.Factory.StartNew
?这将使用额外的线程,一旦你耗尽线程池中的所有线程,程序将变得非常慢,因为线程池大小使用非常慢的爬山算法增加。我很想看看程序运行时程序中的线程数。